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(); }, 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: "龙起襄樊", }, }; });