import { lib, game, ui, get, ai, _status } from "../noname.js"; game.import("character", function () { return { name: "xianjian", character: { pal_lixiaoyao: ["male", "qun", 4, ["tianjian", "xjyufeng"]], pal_zhaoliner: ["female", "wei", 3, ["huimeng", "tianshe"]], pal_linyueru: ["female", "wei", 3, ["guiyuan", "qijian"]], pal_anu: ["female", "wu", 3, ["lingdi", "anwugu"]], pal_wangxiaohu: ["male", "qun", 4, ["husha"]], pal_sumei: ["female", "shu", 3, ["sheying", "dujiang", "huahu"]], pal_shenqishuang: ["female", "wei", 3, ["qixia", "jianzhen", "binxin"]], pal_jingtian: ["male", "wu", 3, ["sajin", "jtjubao"]], pal_xuejian: ["female", "shu", 3, ["xshuangren", "shenmu", "duci"]], pal_longkui: ["female", "qun", 3, ["fenxing", "diewu", "lingyu"]], pal_zixuan: ["female", "wei", 3, ["shuiyun", "wangyou", "changnian"]], pal_changqing: ["male", "wei", 4, ["luanjian", "ctianfu"]], pal_nangonghuang: ["male", "wei", 3, ["zhaoyao", "sheling", "zhangmu"]], pal_wenhui: ["female", "shu", 4, ["huxi", "longxiang"]], pal_wangpengxu: ["female", "shu", 3, ["duxinshu", "feixu"]], pal_xingxuan: ["male", "wei", 3, ["feizhua", "leiyu", "lingxue"]], pal_leiyuange: ["male", "shu", 4, ["feng", "ya", "song"]], pal_yuntianhe: ["male", "wu", 4, ["longxi", "zhuyue", "guanri"]], pal_hanlingsha: ["female", "shu", 3, ["tannang", "tuoqiao"]], pal_liumengli: ["female", "wei", 3, ["tianxian", "runxin", "xjzhimeng"]], pal_murongziying: ["male", "wei", 4, ["xuanning", "poyun", "qianfang"]], pal_xuanxiao: ["male", "wei", 4, ["xuanyan", "ningbin", "xfenxin"]], pal_jiangyunfan: ["male", "wei", 4, ["xunying", "liefeng"]], pal_tangyurou: ["female", "shu", 3, ["txianqu", "qiongguang"]], pal_longyou: ["male", "wei", 4, ["yuexing", "minsha"]], pal_xiaoman: ["female", "shu", 3, ["anwugu", "lingquan", "shenwu"]], pal_xiahoujinxuan: ["male", "shu", 3, ["xuanmo", "danqing"]], pal_muchanglan: ["female", "wu", 3, ["feixia", "lueying"]], pal_xia: ["female", "shu", 3, ["xjzongyu", "fanling"]], pal_jiangcheng: ["male", "qun", 4, ["yanzhan", "fenshi"]], pal_yuejinzhao: ["male", "wei", 4, ["ywuhun", "xjyingfeng"]], pal_yueqi: ["female", "wei", 3, ["tianwu", "liguang", "shiying"]], pal_mingxiu: ["female", "shu", 3, ["linghuo", "guijin", "chengxin"]], pal_xianqing: ["male", "qun", 4, ["xtanxi", "xiaoyue"]], pal_luozhaoyan: ["female", "shu", 4, ["fenglue", "tanhua"]], pal_jushifang: ["male", "shu", 3, ["yujia", "xiepan", "yanshi"]], }, characterIntro: { pal_lixiaoyao: "一个天资聪颖的乡下客栈店小二,因一壶酒被酒剑仙传授了蜀山仙剑派剑术,在仙灵岛与赵灵儿相遇,自此经历重重磨难成长为一代旷世奇侠。灵儿牺牲以后他悲痛欲绝。后出任蜀山掌门,取道号一贫,从此御剑行遍天下,行侠仗义、斩妖除魔。多年后因魔教之乱,故引咎卸职,成为蜀山七圣之一。而后虽心力交瘁,但仍竭力保护天下苍生。", pal_zhaoliner: "林青儿与巫王之女,亦是女娲族人。自幼与世隔绝,跟随姥姥隐居仙灵岛修炼,躲避仇人的追杀。难以告人的神秘身世,让她逃不过命运的捉弄,注定在滚滚红尘中历尽千灾万劫。在最终,赵灵儿为了消灭拜月水魔兽,与其同归于尽。但在王小虎、李忆如决战大魔头千叶禅师的结尾,出现了她的声音。", pal_linyueru: "天资灵秀,聪敏慧黠,情深义重。身为江南武林魁首林家堡之武门千金,与李逍遥不打不相识,并在此后的寻人旅途中相知相恋。在经历过重重艰辛和生离死别后,遥月二人终于携手而共结连理,与高堂娇儿共享天伦。", pal_wangxiaohu: "李逍遥的同乡,自小仰慕李逍遥,想要拜在他门下,得知拜师无望之后,遂跟随李大婶学习排云掌法。之后前往杭州拜“三大神捕”之一的”神眼魔刀”盛尊武为师,并习得魔刀刀法。热血少年,敢作敢当,嫉恶如仇,相信人定胜天。他最后发现千叶禅师的阴谋,与众人合力击败千叶禅师。", pal_sumei: "蛇妖和狐精之女,其父母当年被李逍遥和林月如所杀,因此她一直想要报仇,可以说是为报仇而活着。爱上王小虎,认识李忆如之后,苏媚学会了宽恕,最后甚至为了朋友和爱人牺牲自己。", pal_shenqishuang: "乳名沈七七,峨嵋山仙霞派掌门清柔师太座下弟子,与四位师姊妹合称“仙霞五奇”,排行第四,个性拘谨温婉,对小虎心怀爱意却不敢开口表达。", pal_jingtian: "永安当的小伙计,司“管饰”一职,专门保管当铺收押的首饰珠宝类贵重物品。景天不但有鉴别古董珠宝的天赋,而且对买卖、帐目能很精通,对保管的当品更有过目不忘的本事。每日幻想有朝一日能富甲天下或成为人人景仰的蜀山剑仙。", pal_xuejian: "出身唐门,虽为大小姐,却备受家族内部排挤欺凌。后离开唐家堡,与景天等人一同浪迹江湖并探寻自己的身世秘密。经历各种事件后,与景天结为连理,并育有一子名为景小楼。", pal_longkui: "古时的姜国公主,景天前世龙阳的妹妹。因国破家亡而跳入铸剑炉,成为魔剑剑灵。龙葵拥有两种性格形态:蓝色龙葵温柔娴淑,红色龙葵火辣张扬。", pal_zixuan: "女娲族后裔,饱受情爱煎熬三生三世之苦。在面对为了天下苍生而牺牲生命的女娲族宿命时,她坦然接受,把自己用水灵珠修炼的内丹渡给徐长卿使他成为上仙,最后献出自己的生命封印锁妖塔。", pal_changqing: "蜀山仙剑派俗家弟子。自幼被蜀山掌门清微收为入室弟子,武学天赋极高。与紫萱相恋三世,最终紫萱为修复锁妖塔而牺牲了自己并把自己用水灵珠修炼的内丹渡给徐长卿,使徐长卿迅速成仙并继任蜀山派第二十三代掌门,最后辞去了掌门职务归隐。", pal_nangonghuang: '出生不久后父母被为了追寻记忆而来燎日所误杀,后来被常纪带到蜀山抚养长大,视同己出。从小希望得到尊敬。后来奉蜀山掌门徐长卿之命开启地脉入口,疏通五灵,从而使蜀山"否极泰来"、回复混沌状态。', pal_wenhui: "爽朗大方,性情如同男子,极富正义感;内心却是天真少女般剔透明净。因为不愿嫁去室韦而逃出家里,后与南宫煌相遇,并随其完成地脉任务。", pal_wangpengxu: "原形是一只娇小可爱的五毒兽。擅长读心术,可以看透人的心思。多次被南宫煌无意中救下,后跟随其恢复地脉。", pal_xingxuan: "南宫煌之兄,幼时被燎日带走并由其抚养长大。身体其实是一具尸体(尸体是其父赤炎的),不仅残缺而且带有剧毒。初,灵肉分离,身体毫无感觉,后经重楼相助灵肉合一。为使尸身不坏,使用剧毒保存,故无法进入人界,绝大多数时间身在里蜀山。有领导才能,凭借自身上位者的气质和才干,在里蜀山妖界占据了一定势力。", pal_leiyuange: "是个来历成谜的木讷男子,擅长使用弩、单手斧,有三只名为风雅颂的怪鸟时常出现在他的头顶代替其言语。生前为室韦族族长,死后尸体被鬼差附身。在胜洲与南宫煌与温慧等人结识,并成为好友。", pal_yuntianhe: "自幼孤身一人在黄山青鸾峰长大,从未下过山,对外界事物一无所知。一次偶然的机会与闯入父亲的墓室寻找宝藏的少女韩菱纱相遇。为了更多地了解父亲的过去、也为了成为剑仙,云天河与韩菱纱和柳梦璃一同拜入昆仑琼华派成为门下弟子。下山后云天河虽经历种种,但从未改变过“我命由我不由天”的想法。", pal_hanlingsha: "背负着家族命运而四处奔走的少女,自称是独行千里的陵墓大盗。年纪不大,却对辨识墓穴位置、破解奇诡机关、地脉风水之学颇有研究。", pal_liumengli: "妖界婵幽之女,因19年前妖界大战而失散,被云天青行侠救下后送至寿阳城县家抚养。", pal_murongziying: "昆仑琼华派弟子。很小就被家人送至琼华派修行,天赋极高,在同辈弟子中修为较深,已臻“以气御剑”的境界。性格外冷内热,稳重内敛;看似不易相处,实则是一个恩怨分明、极重情义的热血男儿。", pal_xuanxiao: "天赋异禀,资质极佳,是万中无一的修仙奇才,和夙玉用双剑束缚幻瞑界吸取灵力并引发琼华派与妖界之战。因夙玉离开昆仑,修炼双剑中断,他被邪火入侵而走火入魔,打伤数名师兄弟,被夙瑶联合青阳、重光与宗炼长老冰封19年,因此逢缘与云天河结拜。", // pal_jiangyunfan:'', // pal_tangyurou:'', // pal_longyou:'', // pal_xiaoman:'', pal_xiahoujinxuan: "夏侯世家的少主。因不喜舞枪弄剑,专爱趣闻逸史,让父亲深感恨铁不成钢;好在他对于仙术符法也有所涉略,没沦落到手无缚鸡之力的境地。", pal_muchanglan: "行走江湖买卖消息的佣兵,冷艳霸气,洞察力强。受人雇佣而加入夏侯瑾轩等一行人,虽然目的不纯,但通过相处,渐渐地被改变;同时通过夏侯瑾轩等人的帮助,完成了救治暮蔼村村民的心愿。", pal_xia: "走江湖卖艺为生的孤女,性格倔强,自尊心强,不喜欢被人小看,更不爱占别人的便宜。卖艺的艰辛让她深知人间冷暖,却仍保持善良天性。", pal_jiangcheng: "折剑山庄庄主欧阳英的得意门生,但因其蚩尤后人魔族的身份,令他无法被容于人界;再加上人界半魔同族饱受人类迫害,故最终成为净天教教主魔君“姜世离”,毅然肩负起保护同族的重任。", }, skill: { lingquan: { trigger: { player: "phaseEnd" }, forced: true, skillAnimation: true, animationColor: "water", unique: true, filter: function (event, player) { return game.roundNumber >= 3 && player.getHistory("useCard").length > player.hp; }, content: function () { "step 0"; player.awakenSkill("lingquan"); player.draw(3); player.addSkill("shuiyun"); "step 1"; if (lib.filter.filterTrigger(trigger, player, "phaseEnd", "shuiyun")) game.createTrigger("phaseEnd", "shuiyun", player, trigger); }, }, shenwu: { trigger: { global: "phaseEnd" }, forced: true, skillAnimation: true, animationColor: "water", unique: true, filter: function (event, player) { return player.storage.shuiyun_count >= 3; }, content: function () { player.awakenSkill("shenwu"); player.gainMaxHp(); player.recover(); player.addSkill("huimeng"); }, }, qiongguang: { trigger: { player: "phaseDiscardEnd" }, filter: function (event, player) { return event.cards && event.cards.length > 1; }, content: function () { "step 0"; event.targets = player.getEnemies().sortBySeat(); "step 1"; if (event.targets.length) { player.line(event.targets.shift().getDebuff(false).addExpose(0.1), "green"); event.redo(); } "step 2"; game.delay(); }, ai: { threaten: 2, expose: 0.2, effect: { player: function (card, player) { if (_status.currentPhase != player) return; if (_status.event.name != "chooseToUse" || _status.event.player != player) return; var num = player.needsToDiscard(); if (num > 2 || num == 1) return; if (get.type(card) == "basic" && num != 2) return; if (get.tag(card, "gain")) return; if (get.value(card, player, "raw") >= 7) return; if (player.hp <= 2) return; if (!player.hasSkill("jilue") || player.storage.renjie == 0) { return "zeroplayertarget"; } }, }, }, }, txianqu: { trigger: { source: "damageBefore" }, logTarget: "player", filter: function (event, player) { if (player.hasSkill("txianqu2")) return false; var evt = event.getParent("phaseUse"); if (evt && evt.player == player) return true; return false; }, check: function (event, player) { var target = event.player; if (get.attitude(player, target) >= 0 || get.damageEffect(target, player, player) <= 0) return true; if (target.hp > player.hp && player.isDamaged()) return true; return false; }, content: function () { trigger.cancel(); player.draw(2); player.recover(); player.addTempSkill("txianqu2"); }, ai: { jueqing: true, skillTagFilter: function (player, tag, arg) { if (!arg) return false; if (player.hasSkill("txianqu2")) return false; if (get.attitude(player, arg) > 0) return false; var evt = _status.event.getParent("phaseUse"); if (evt && evt.player == player) return true; return false; }, effect: { player: function (card, player, target) { if (get.tag(card, "damage") && get.attitude(player, target) > 0) { if ( player.hp == player.maxHp || get.recoverEffect(player, player, player) <= 0 ) return "zeroplayertarget"; return [0, 0, 0, 0.5]; } }, }, }, }, txianqu2: {}, xunying: { trigger: { player: "shaAfter" }, direct: true, filter: function (event, player) { return player.canUse("sha", event.target) && player.hasSha() && event.target.isIn(); }, content: function () { "step 0"; if (player.hasSkill("jiu")) { player.removeSkill("jiu"); event.jiu = true; } player.chooseToUse(get.prompt("xunying"), { name: "sha" }, trigger.target, -1).logSkill = "xunying"; "step 1"; if (result.bool); else if (event.jiu) { player.addSkill("jiu"); } }, }, liefeng: { trigger: { player: "useCard" }, forced: true, popup: false, filter: function (event, player) { return _status.currentPhase == player && [2, 3, 4].includes(player.countUsed()); }, content: function () { var skill; switch (player.countUsed()) { case 2: skill = "yanzhan"; break; case 3: skill = "tianjian"; break; case 4: skill = "xjyufeng"; break; } if (skill && !player.hasSkill(skill)) { player.addTempSkill(skill); player.popup(skill); game.log(player, "获得了", "【" + get.translation(skill) + "】"); if (skill == "xjyufeng") { var nh = player.countCards("h"); if (nh < 2) { player.draw(2 - nh); player.addSkill("counttrigger"); if (!player.storage.counttrigger) { player.storage.counttrigger = {}; } player.storage.counttrigger.xjyufeng = 1; } } } }, ai: { effect: { player: function (card, player) { if (_status.currentPhase != player) return; if (get.type(card) == "basic") return; if (get.tag(card, "gain")) return; if (get.value(card, player, "raw") >= 7) return; if (player.hp <= 2) return; if (player.needsToDiscard()) return; if (player.countUsed() >= 2) return; return "zeroplayertarget"; }, }, }, }, yuexing: { enable: "phaseUse", usable: 1, filterTarget: function (card, player, target) { return target != player; }, content: function () { player.storage.yuexing2 = target; player.addTempSkill("yuexing2", "phaseUseAfter"); target.storage.yuexing2 = player; target.addTempSkill("yuexing2", "phaseUseAfter"); }, ai: { order: function () { var player = _status.event.player; if (player.hasSkill("minsha")) return 6.5; return 2; }, result: { target: function (player, target) { if ( player.hasSkill("minsha") && player.countCards("he") >= 3 && target.hp > 1 && get.damageEffect(target, player, player, "thunder") > 0 ) { var num1 = game.countPlayer(function (current) { if ( get.distance(target, current) <= 1 && current != player && current != target ) { return -get.sgn(get.attitude(player, current)); } }); var num2 = game.countPlayer(function (current) { if ( get.distance(player, current) <= 1 && current != player && current != target ) { return -get.sgn(get.attitude(player, current)); } }); if (num2 >= num1) return 0; return 2 * (num2 - num1); } return -_status.event.getRand(); }, }, }, }, yuexing2: { mark: "character", intro: { content: "到其他角色的距离基数与$交换", }, onremove: true, mod: { globalFrom: function (from, to, distance) { if (from.storage.yuexing2) { var dist1 = get.distance(from, to, "pure"); var dist2 = get.distance(from.storage.yuexing2, to, "pure"); return distance - dist1 + dist2; } }, }, }, minsha: { enable: "phaseUse", usable: 1, filterCard: true, selectCard: 2, position: "he", filter: function (event, player) { return player.countCards("he") >= 2; }, filterTarget: function (card, player, target) { return target != player && target.hp > 1; }, line: "thunder", check: function (card) { return 8 - get.value(card); }, content: function () { "step 0"; target.damage("thunder"); "step 1"; event.targets = game .filterPlayer(function (current) { return ( get.distance(target, current) <= 1 && current != target && current != player ); }) .sortBySeat(target); "step 2"; if (event.targets.length) { event.targets.shift().randomDiscard(false); event.redo(); } }, ai: { order: 6, result: { player: function (player, target) { if (get.damageEffect(target, player, player, "thunder") > 0) { if (target == player.storage.yuexing2) { return 10; } var num = 1 + game.countPlayer(function (current) { if ( get.distance(target, current) <= 1 && current != player && current != target ) { return -get.sgn(get.attitude(player, current)); } }); if (target.hp == 1) { num += 2; } if (target.hp < player.hp) { num += 0.5; } if (player.needsToDiscard()) num += 0.1; return num; } }, }, }, }, lingdi: { enable: "phaseUse", filter: function (event, player) { var num = 1 + (player.getStat().skill.lingdi || 0); if ( game.hasPlayer(function (current) { return current != player && Math.max(1, get.distance(player, current)) == num; }) ) { var hs = player.getCards("h"); var suits = player.storage.lingdi || []; for (var i = 0; i < hs.length; i++) { if (!suits.includes(get.suit(hs[i]))) { return true; } } } return false; }, filterTarget: function (card, player, target) { return ( target != player && Math.max(1, get.distance(player, target)) == 1 + (player.getStat().skill.lingdi || 0) ); }, filterCard: function (card, player) { return !(player.storage.lingdi || []).includes(get.suit(card)); }, check: function (card) { return 8 - get.value(card); }, content: function () { game.asyncDraw([player, target]); if (!player.storage.lingdi) { player.storage.lingdi = []; } player.storage.lingdi.add(get.suit(cards[0])); }, ai: { threaten: 1.2, order: 7, result: { target: 1, }, }, group: "lingdi_clear", subSkill: { clear: { trigger: { player: "phaseAfter" }, silent: true, content: function () { delete player.storage.lingdi; }, }, }, }, xiaoyue: { trigger: { global: "roundStart" }, forced: true, filter: function (event, player) { return player.countCards("h", "sha"); }, content: function () { var card = player.getCards("h", "sha").randomGet(); var target = player.getEnemies().randomGet(); if (card && target) { target.addExpose(0.1); player.useCard(card, target, false); player.changeHujia(); } }, ai: { effect: { player: function (card, player, target) { if (_status.currentPhase != player) return; if ( card.name == "sha" && get.itemtype(card) == "card" && !player.needsToDiscard() && target.hp > 1 && player.countCards("h", "sha") == 1 ) { return "zeroplayertarget"; } }, }, }, }, xiaoyue2: { mod: { cardRespondable: function (card, player) { if (_status.event.getParent(4).name == "xiaoyue" && get.suit(card) != "heart") return false; }, }, }, huanlei: { trigger: { player: "damageEnd" }, check: function (event, player) { return get.damageEffect(event.source, player, player, "thunder") > 0; }, filter: function (event, player) { return event.source && event.source.isIn() && event.source.hp > player.hp; }, logTarget: "source", content: function () { "step 0"; trigger.source.damage("thunder"); "step 1"; trigger.source.draw(); }, }, anwugu: { trigger: { source: "damageEnd" }, check: function (event, player) { return get.attitude(player, event.player) < 0; }, filter: function (event, player) { if (event._notrigger.includes(event.player)) return false; return event.player != player && event.player.isIn() && !event.player.hasSkill("anwugu2"); }, logTarget: "player", content: function () { trigger.player.addSkill("anwugu2"); }, }, anwugu2: { mod: { cardEnabled: function (card, player) { if (_status.currentPhase != player) return; if (player.countUsed() >= player.storage.anwugu2) return false; }, maxHandcard: function (player, num) { return num - 1; }, }, mark: true, intro: { content: "手牌上限-1,每回合最多使用$张牌(剩余$回合)", }, init: function (player) { player.storage.anwugu2 = 3; }, trigger: { player: "phaseAfter" }, silent: true, onremove: true, content: function () { player.storage.anwugu2--; if (player.storage.anwugu2 <= 0) { // player.loseHp(); player.removeSkill("anwugu2"); } else { player.updateMarks(); } }, }, xtanxi: { enable: "phaseUse", usable: 1, filterCard: true, check: function (card) { var enemies = _status.event.player.getEnemies(); var num1 = 0, num2 = 0; for (var i = 0; i < enemies.length; i++) { if (enemies[i].countCards("h", "sha")) num1++; if (enemies[i].countCards("h", "shan")) num2++; if (enemies[i].countCards("h") >= 3) { num1 += 0.5; num2 += 0.5; } } var rand = _status.event.getRand(); if (num1 >= 1 && num2 >= 1) { if (card.name == "shan") return (rand += 0.4); if (card.name == "sha") return rand; } else if (num1 >= 1) { if (card.name == "sha") return rand; } else if (num2 >= 1) { if (card.name == "shan") return rand; } return 0; }, content: function () { player.addExpose(0.1); var targets = player.getEnemies(); for (var i = 0; i < targets.length; i++) { if (!targets[i].countCards("h", cards[0].name)) { targets.splice(i--, 1); } } if (targets.length) { var target = targets.randomGet(); player.line(target, "green"); target.addExpose(0.1); player.gainPlayerCard(target, "h", "visible"); } }, ai: { order: 4, result: { player: 1, }, }, }, linghuo: { round: 2, trigger: { global: "phaseEnd" }, filter: function (event, player) { return event.player.getStat("damage") && event.player != player; }, check: function (event, player) { return get.damageEffect(event.player, player, player, "fire") > 0; }, logTarget: "player", line: "fire", ai: { expose: 0.2, threaten: 1.3, }, content: function () { trigger.player.damage("fire"); }, }, guijin: { round: 3, enable: "phaseUse", delay: 0, content: function () { "step 0"; event.cards = get.cards(4); "step 1"; if (event.cards.length) { var more = false, remain = false, nomore = false; if (event.cards.length >= 3) { for (var i = 0; i < event.cards.length; i++) { var value = get.value(event.cards[i], player, "raw"); if (value >= 8) { more = true; } if (event.cards.length >= 4 && value < 6) { if (remain === false) { remain = value; } else { remain = Math.min(remain, value); } } } } if (remain === false) { remain = 0; } if ( !more && !game.hasPlayer(function (current) { return ( get.attitude(player, current) < 0 && !current.skipList.includes("phaseDraw") ); }) ) { var num = 0; for (var i = 0; i < event.cards.length; i++) { num += Math.max(0, get.value(event.cards[i], player, "raw")); } if (num >= 12) { more = true; } else { nomore = true; } } player.chooseCardButton("归烬", event.cards, [1, event.cards.length]).ai = function ( button ) { if (nomore) return 0; if (more) { return get.value(button.link, player, "raw") - remain; } else { if (ui.selected.buttons.length) return 0; return 8 - get.value(button.link, player, "raw"); } }; } else { event.goto(4); } "step 2"; if (result.bool) { for (var i = 0; i < result.links.length; i++) { event.cards.remove(result.links[i]); } event.togive = result.links.slice(0); player.chooseTarget("将" + get.translation(result.links) + "交给一名角色", true).ai = function (target) { var att = get.attitude(player, target) / Math.sqrt(target.countCards("h") + 1); if (result.links.length > 1) { if (target == player && target.needsToDiscard(result.links) > 1) return att / 5; return att; } else { if (target.skipList.includes("phaseDraw")) return att / 5; return -att; } }; } else { event.goto(4); } "step 3"; if (result.targets.length) { result.targets[0].gain(event.togive, "draw"); result.targets[0].skip("phaseDraw"); result.targets[0].addTempSkill("guijin2", { player: "phaseBegin" }); game.log( result.targets[0], "获得了" + get.cnNumber(event.togive.length) + "张", "#g“归烬”牌" ); player.line(result.targets[0], "green"); event.goto(1); } "step 4"; while (event.cards.length) { ui.cardPile.insertBefore(event.cards.pop(), ui.cardPile.firstChild); } }, ai: { order: 1, result: { player: function (player) { if (game.roundNumber == 1 && player.hasUnknown()) return 0; return 1; }, }, }, }, guijin2: { mark: true, intro: { content: "跳过下一个摸牌阶段", }, ai: { effect: { target: function (card, player, target) { if (card.name == "bingliang" || card.name == "caomu") return 0; }, }, }, }, chengxin: { round: 4, enable: "chooseToUse", filter: function (event, player) { return event.type == "dying"; }, filterTarget: function (card, player, target) { return target == _status.event.dying; }, selectTarget: -1, content: function () { target.recover(1 - target.hp); target.addTempSkill("chengxin2", { player: "phaseAfter" }); }, ai: { order: 6, threaten: 1.4, skillTagFilter: function (player) { if (4 - (game.roundNumber - player.storage.chengxin_roundcount) > 0) return false; if (!_status.event.dying) return false; }, save: true, result: { target: 3, }, }, }, chengxin2: { trigger: { player: "damageBefore" }, mark: true, forced: true, content: function () { trigger.cancel(); }, ai: { nofire: true, nothunder: true, nodamage: true, effect: { target: function (card, player, target, current) { if (get.tag(card, "damage")) return [0, 0]; }, }, }, intro: { content: "防止一切伤害", }, }, tianwu: { trigger: { player: "useCardToBegin" }, filter: function (event, player) { if (get.is.altered("tianwu") && player.hasSkill("tianwu2")) return false; return ( event.targets && event.targets.length == 1 && player.getEnemies().includes(event.target) ); }, // alter:true, frequent: true, content: function () { trigger.target.getDebuff(); player.addTempSkill("tianwu2"); }, }, tianwu2: {}, shiying: { trigger: { global: "dieBefore" }, skillAnimation: "epic", animationColor: "water", unique: true, init: function (player) { player.storage.shiying = false; }, mark: true, intro: { content: "limited", }, check: function (event, player) { return get.attitude(player, event.player) >= 3; }, filter: function (event, player) { return !player.storage.shiying && event.player != player; }, logTarget: "player", content: function () { "step 0"; trigger.cancel(); player.awakenSkill("shiying"); player.storage.shiying = true; player.maxHp = 3; player.hp = 3; trigger.player.maxHp = 3; trigger.player.hp = 3; player.clearSkills(); trigger.player.clearSkills(); "step 1"; var hs = player.getCards("hej"); player.$throw(hs); player.lose(player.getCards("hej"))._triggered = null; "step 2"; var hs = trigger.player.getCards("hej"); trigger.player.$throw(hs); trigger.player.lose(trigger.player.getCards("hej"))._triggered = null; "step 3"; game.asyncDraw([player, trigger.player], 3); }, ai: { threaten: 1.5, }, }, liguang: { trigger: { player: "phaseEnd" }, filter: function (event, player) { if (!player.canMoveCard()) return false; if ( !game.hasPlayer(function (current) { return current.countCards("ej"); }) ) { return false; } return player.countCards("h") > 0; }, direct: true, content: function () { "step 0"; player .chooseToDiscard( get.prompt("liguang"), "弃置一张手牌并移动场上的一张牌", lib.filter.cardDiscardable ) .set("ai", function (card) { if (!_status.event.check) return 0; return 7 - get.useful(card); }) .set("check", player.canMoveCard(true)) .set("logSkill", "liguang"); "step 1"; if (result.bool) { player.moveCard(true); } else { event.finish(); } }, ai: { expose: 0.2, threaten: 1.3, }, }, xiepan: { trigger: { player: "loseEnd" }, direct: true, filter: function (event, player) { if (player.countCards("h", { type: "basic" })) return false; if (!player.countCards("h")) return false; for (var i = 0; i < event.cards.length; i++) { if (event.cards[i].original == "h" && get.type(event.cards[i]) == "basic") return true; } return false; }, content: function () { "step 0"; player .chooseToDiscard("h", get.prompt("xiepan")) .set("prompt2", "弃置一张手牌并获一件随机装备") .set("logSkill", "xiepan").ai = function (card) { return 8 - get.value(card); }; "step 1"; if (result.bool) { player.gain(game.createCard(get.inpile("equip").randomGet()), "draw"); } }, }, yujia: { trigger: { player: "useCardAfter" }, frequent: true, filter: function (event) { return get.type(event.card) == "equip" && lib.inpile.includes(event.card.name); }, init: function (player) { player.storage.yujia = 0; }, content: function () { "step 0"; if (!player.storage.yujia) { player.storage.yujia = []; } var list = []; for (var i in lib.card) { if (lib.card[i].type == "jiguan") { list.push(i); } } if (list.length) { if (player.storage.yujia > 1) { list = list.randomGets(player.storage.yujia); for (var i = 0; i < list.length; i++) { list[i] = ["机关", "", list[i]]; } player.chooseButton(true, ["御甲:选择一张机关牌获得之", [list, "vcard"]]).ai = function (button) { if ( player.hasSkill("jiguanyaoshu_skill") && button.link[2] == "jiguanyaoshu" ) return 0; return get.value({ name: button.link[2] }); }; } else { var name = list.randomGet(); player.gain(game.createCard(name), "draw"); event.finish(); } } "step 1"; if (result.bool && result.links && result.links.length) { var list = []; for (var i = 0; i < result.links.length; i++) { list.push(game.createCard(result.links[i][2])); } player.gain(list, "draw"); } }, group: "yujia_count", subSkill: { count: { trigger: { player: "useCardAfter" }, filter: function (event, player) { return get.type(event.card) == "jiguan"; }, silent: true, content: function () { player.storage.yujia++; }, }, }, ai: { reverseEquip: true, threaten: 1.5, effect: { target: function (card, player, target, current) { if (get.type(card) == "equip") return [1, 3]; }, }, }, }, yanshi: { trigger: { player: "phaseAfter" }, forced: true, skillAnimation: true, init: function (player) { player.storage.yanshi = 0; }, filter: function (event, player) { return player.storage.yanshi == 4; }, intro: { content: "累计#个回合使用过机关牌", }, content: function () { "step 0"; player.awakenSkill("yanshi"); player.gainMaxHp(); "step 1"; player.recover(); var list = []; for (var i = 1; i <= 5; i++) { if (!player.getEquip(i)) { var name = get.inpile("equip" + i).randomGet(); if (name) { var card = game.createCard(name); list.push(card); player.equip(card); } } } if (list.length) { player.$draw(list); } }, group: "yanshi_count", subSkill: { count: { trigger: { player: "useCardAfter" }, filter: function (event, player) { return get.type(event.card) == "jiguan" && !player.hasSkill("yanshi2"); }, silent: true, content: function () { player.storage.yanshi++; if (player.hasSkill("yanshi")) { player.markSkill("yanshi"); player.updateMarks(); } player.addTempSkill("yanshi2"); }, }, }, }, yanshi2: {}, tanhua: { trigger: { player: "recoverBefore" }, forced: true, filter: function (event, player) { return player.hp > 0 && event.num > 0; }, content: function () { trigger.cancel(); player.draw(2 * trigger.num); }, group: "tanhua_remove", subSkill: { remove: { trigger: { player: "dying" }, priority: 10, forced: true, content: function () { player.recover(); player.removeSkill("tanhua"); }, }, }, }, xjyingfeng: { trigger: { player: "useCardAfter" }, filter: function (event, player) { if (event.card.name != "sha") return false; if (event.parent.name == "xjyingfeng") return false; var enemies = player.getEnemies(); return game.hasPlayer(function (current) { return ( enemies.includes(current) && !event.targets.includes(current) && player.canUse("sha", current, false) ); }); }, forced: true, content: function () { var enemies = player.getEnemies(); enemies.remove(trigger.targets); if (enemies.length) { player.useCard({ name: "sha" }, enemies.randomGet().addExpose(0.2)); } }, }, ywuhun: { trigger: { player: "phaseBefore" }, forced: true, // alter:true, filter: function (event) { return event.parent.name != "ywuhun"; }, intro: { content: "回合结束后,场上及牌堆中的牌将恢复到回合前的状态", }, video: function (player, data) { for (var i in data) { var current = game.playerMap[i]; current.node.handcards1.innerHTML = ""; current.node.handcards2.innerHTML = ""; current.node.equips.innerHTML = ""; current.node.judges.innerHTML = ""; current.directgain(get.infoCards(data[i].h)); var es = get.infoCards(data[i].e); for (var j = 0; j < es.length; j++) { current.$equip(es[j]); } var js = get.infoCards(data[i].j); for (var j = 0; j < js.length; j++) { current.node.judges.appendChild(js[j]); } } }, content: function () { "step 0"; var handcards1, handcards2, judges, equips, viewAs, i, j; event.data = []; event.cardPile = []; for (i = 0; i < game.players.length; i++) { viewAs = []; handcards1 = []; handcards2 = []; judges = []; equips = []; for (j = 0; j < game.players[i].node.handcards1.childNodes.length; j++) handcards1.push(game.players[i].node.handcards1.childNodes[j]); for (j = 0; j < game.players[i].node.handcards2.childNodes.length; j++) handcards2.push(game.players[i].node.handcards2.childNodes[j]); for (j = 0; j < game.players[i].node.judges.childNodes.length; j++) { viewAs.push(game.players[i].node.judges.childNodes[j].viewAs); judges.push(game.players[i].node.judges.childNodes[j]); } for (j = 0; j < game.players[i].node.equips.childNodes.length; j++) equips.push(game.players[i].node.equips.childNodes[j]); event.data.push({ player: game.players[i], handcards1: handcards1, handcards2: handcards2, judges: judges, equips: equips, viewAs: viewAs, value: handcards1.length + handcards2.length + equips.length - judges.length, }); } for (var i = 0; i < ui.cardPile.childElementCount; i++) { event.cardPile.push(ui.cardPile.childNodes[i]); } "step 1"; player.markSkill("ywuhun"); player.addSkill("ywuhun_end"); player.phase("ywuhun"); "step 2"; player.removeSkill("ywuhun_end"); game.delay(0.5); "step 3"; game.animate.window(1); "step 4"; player.unmarkSkill("ywuhun"); var storage = event.data; for (var i = 0; i < storage.length; i++) { var current = storage[i].player; if (current.isAlive()) { current.removeEquipTrigger(); var cards = current.getCards("hej"); for (var j = 0; j < cards.length; j++) { cards[j].discard(); } } } "step 5"; var storage = event.data; var current; var i, j; for (i = 0; i < storage.length; i++) { current = storage[i].player; if (current.isAlive()) { for (j = 0; j < storage[i].handcards1.length; j++) { if ( storage[i].handcards1[j].parentNode == ui.discardPile || storage[i].handcards1[j].parentNode == ui.cardPile ) { current.node.handcards1.appendChild(storage[i].handcards1[j]); } else { current.node.handcards1.appendChild( game.createCard(storage[i].handcards1[j]) ); } } for (j = 0; j < storage[i].handcards2.length; j++) { if ( storage[i].handcards2[j].parentNode == ui.discardPile || storage[i].handcards2[j].parentNode == ui.cardPile ) { current.node.handcards2.appendChild(storage[i].handcards2[j]); } else { current.node.handcards2.appendChild( game.createCard(storage[i].handcards2[j]) ); } } for (j = 0; j < storage[i].equips.length; j++) { if ( storage[i].equips[j].parentNode == ui.discardPile || storage[i].equips[j].parentNode == ui.cardPile ) { storage[i].equips[j].style.transform = ""; current.$equip(storage[i].equips[j]); } else { current.$equip(game.createCard(storage[i].equips[j])); } } for (j = 0; j < storage[i].judges.length; j++) { if ( storage[i].judges[j].parentNode == ui.discardPile || storage[i].judges[j].parentNode == ui.cardPile ) { storage[i].judges[j].style.transform = ""; storage[i].judges[j].viewAs = storage[i].viewAs[j]; if ( storage[i].judges[j].viewAs && storage[i].judges[j].viewAs != storage[i].judges[j].name && storage[i].judges[j].classList.contains("fullskin") ) { storage[i].judges[j].classList.add("fakejudge"); storage[i].judges[j].node.background.innerHTML = lib.translate[storage[i].judges[j].viewAs + "_bg"] || get.translation(storage[i].judges[j].viewAs)[0]; } current.node.judges.appendChild(storage[i].judges[j]); } } current.update(); } } var data = {}; for (var i = 0; i < game.players.length; i++) { data[game.players[i].dataset.position] = { h: get.cardsInfo(game.players[i].getCards("h")), e: get.cardsInfo(game.players[i].getCards("e")), j: get.cardsInfo(game.players[i].getCards("j")), }; } game.addVideo("skill", event.player, ["ywuhun", data]); game.animate.window(2); while (ui.cardPile.childElementCount) { ui.cardPile.firstChild.discard(); } for (var i = 0; i < event.cardPile.length; i++) { if (event.cardPile[i].parentNode == ui.discardPile) { ui.cardPile.appendChild(event.cardPile[i]); } else { ui.cardPile.appendChild(game.createCard(event.cardPile[i])); } } ui.updatehl(); }, subSkill: { end: { trigger: { source: "damageEnd" }, priority: 9, silent: true, content: function () { var evt = _status.event.getParent("ywuhun"); if (evt) { _status.event = evt; game.resetSkills(); } }, ai: { jueqing: true, }, }, }, }, fenglue: { trigger: { player: "phaseUseBefore" }, direct: true, filter: function (event, player) { var hs = player.getCards("h"); return game.hasPlayer(function (current) { if (current != player) { for (var i = 0; i < hs.length; i++) { if (get.info(hs[i]).multitarget) continue; if (lib.filter.targetEnabled2(hs[i], player, current)) { return true; } } } }); }, content: function () { "step 0"; var hs = player.getCards("h"); player.chooseTarget(get.prompt("fenglue"), function (card, player, target) { if (player == target) return false; for (var i = 0; i < hs.length; i++) { if (get.info(hs[i]).multitarget) continue; if (lib.filter.targetEnabled2(hs[i], player, target)) { return true; } } return false; }).ai = function (target) { var use = [], eff = 0, damaged = false; for (var i = 0; i < hs.length; i++) { if (get.info(hs[i]).multitarget) continue; var hef; if (get.tag(hs[i], "damage") && damaged) { hef = -1; } else { hef = get.effect(target, hs[i], player, player); } if (lib.filter.targetEnabled2(hs[i], player, target) && hef > 0) { use.push(hs[i]); if (get.attitude(player, target) > 0) { hef /= 1.5; if (get.tag(hs[i], "damage")) { damaged = true; } } eff += hef; } } if ( !player.needsToDiscard(0, (i, player) => { return !use.includes(i) && !player.canIgnoreHandcard(i); }) ) return eff; return 0; }; "step 1"; if (result.bool) { event.target = result.targets[0]; var num = 0; player.chooseCard( [1, Infinity], "按顺序选择对" + get.translation(result.targets) + "使用的牌", function (card) { return lib.filter.targetEnabled2(card, player, event.target); } ).ai = function (card) { if (get.effect(event.target, card, player, player) > 0) { if (get.attitude(player, event.target) > 0 && get.tag(card, "damage")) { for (var i = 0; i < ui.selected.cards.length; i++) { if (get.tag(ui.selected.cards[i], "damage")) { return 0; } } } return get.order(card); } return 0; }; } else { event.finish(); } "step 2"; if (result.bool) { player.logSkill("fenglue", event.target); player.addSkill("fenglue_draw"); player.storage.fenglue_draw_num = 0; player.storage.fenglue_draw = event.target; trigger.cancel(); event.cards = result.cards.slice(0); player.lose(event.cards, ui.special); } else { event.finish(); } "step 3"; if (event.cards.length) { if (event.target.isIn()) { player.useCard(event.cards.shift(), event.target); } else { event.cards.shift().discard(); } event.redo(); } "step 4"; if (player.storage.fenglue_draw_num) { player.draw(player.storage.fenglue_draw_num); } player.removeSkill("fenglue_draw"); delete player.storage.fenglue_draw; delete player.storage.fenglue_draw_num; }, subSkill: { draw: { trigger: { global: "damageEnd" }, forced: true, popup: false, filter: function (event, player) { return event.player == player.storage.fenglue_draw; }, content: function () { player.storage.fenglue_draw_num++; }, }, }, ai: { threaten: 1.3, }, }, xjzongyu: { enable: "phaseUse", usable: 1, filterCard: { color: "black" }, filter: function (event, player) { return lib.card.feibiao && player.countCards("he", { color: "black" }); }, check: function (card) { return 8 - get.value(card); }, content: function () { var list = player.getEnemies(); if (list.length) { player.useCard({ name: "feibiao" }, list.randomGets(2)); } }, ai: { threaten: 1.5, order: 6, result: { player: 1, }, }, }, fanling: { trigger: { global: "loseHpAfter" }, forced: true, usable: 1, filter: function (event, player) { return event.player != player && player.isDamaged(); }, content: function () { player.recover(); }, ai: { threaten: 1.5, }, }, dujiang: { enable: "phaseUse", usable: 1, position: "he", filterCard: { color: "black" }, check: function (card) { return 6 - get.value(card); }, content: function () { var list = player.getEnemies(); if (list.length) { var target = list.randomGet(); player.line(target, "green"); target.gain(game.createCard("du"), "gain2"); } }, ai: { order: 1, result: { player: 1, }, threaten: 1.5, }, }, sheying: { trigger: { source: "damageAfter" }, filter: function (event, player) { return get.itemtype(event.cards) == "cards" && get.position(event.cards[0]) == "d"; }, usable: 1, prompt2: function (event) { return "进行一次判定,若结果为黑色,你获得" + get.translation(event.cards); }, content: function () { "step 0"; player.judge(function (card) { return get.color(card) == "black" ? 1 : -1; }); "step 1"; if (result.color == "black") { player.gain(trigger.cards); player.$gain2(trigger.cards); } }, }, huahu: { enable: "phaseUse", unique: true, mark: true, skillAnimation: true, animationColor: "metal", init: function (player) { player.storage.huahu = false; }, filter: function (event, player) { if (player.storage.huahu) return false; return true; }, filterTarget: function (card, player, target) { return target != player; }, selectTarget: [1, Infinity], contentBefore: function () { player.awakenSkill("huahu"); player.storage.huahu = true; player.loseMaxHp(true); player.clearSkills(); }, content: function () { target.recover(); target.changeHujia(); target.draw(false); target.$draw(); }, ai: { order: 1, result: { target: function (player, target) { if (player.hasUnknown()) return 0; var num = 0; var players = game.filterPlayer(); for (var i = 0; i < players.length; i++) { if ( get.attitude(player, players[i]) > 2 && get.recoverEffect(players[i], player, player) > 0 ) { if (players[i].hp == 1) { if (player.hp < player.maxHp) { return 1; } else { num += 2; } } else if (players[i].hp <= 2) { num++; } } } if (num >= 3) return 1; return 0; }, }, }, intro: { content: "limited", }, }, binxin: { trigger: { global: "phaseEnd" }, check: function (event, player) { return get.attitude(player, event.player) > 0; }, filter: function (event, player) { return event.player.hp == 1; }, logTarget: "player", content: function () { trigger.player.changeHujia(); }, ai: { expose: 0.1, }, }, qixia: { trigger: { player: ["useCardAfter", "respondAfter"] }, silent: true, init: function (player) { player.storage.qixia = []; }, // mark:true, intro: { content: function (storage) { if (!storage.length) { return "未使用或打出过有花色的牌"; } else { var str = "已使用过" + get.translation(storage[0] + "2"); for (var i = 1; i < storage.length; i++) { str += "、" + get.translation(storage[i] + "2"); } str += "牌"; return str; } }, }, content: function () { var suit = get.suit(trigger.card); if (suit) { player.storage.qixia.add(suit); player.syncStorage("qixia"); player.markSkill("qixia"); } }, group: "qixia_phase", subSkill: { phase: { trigger: { global: "phaseAfter" }, priority: -50, forced: true, filter: function (event, player) { return player.storage.qixia.length >= 4; }, content: function () { player.insertPhase(); player.storage.qixia.length = 0; player.syncStorage("qixia"); player.unmarkSkill("qixia"); }, }, }, }, qixia_old: { trigger: { global: "damageAfter" }, direct: true, filter: function (event, player) { return ( !player.hasSkill("qixia2") && event.source != player && event.player.isIn() && player.countCards("he", { color: "red" }) ); }, content: function () { "step 0"; player .chooseToDiscard("he", get.prompt("qixia", trigger.player), { color: "red" }) .set("logSkill", ["qixia", trigger.player]).ai = function (card) { if (get.attitude(player, trigger.player) > 0) { if (trigger.player.hp == 1) { return 10 - get.value(card); } return 8 - get.value(card); } }; "step 1"; if (result.bool) { player.addTempSkill("qixia2"); trigger.player.draw(2); if (trigger.player.hp == 1 && !trigger.player.hujia) { trigger.player.changeHujia(); } } }, ai: { threaten: 1.8, }, }, qixia2: {}, jianzhen: { trigger: { player: "shaAfter" }, forced: true, filter: function (event, player) { return ( event.target.isIn() && game.hasPlayer(function (current) { return current.canUse("sha", event.target, false) && current != player; }) ); }, content: function () { "step 0"; event.targets = game.filterPlayer(function (current) { return current.canUse("sha", trigger.target, false) && current != player; }); event.targets.sortBySeat(trigger.player); "step 1"; if (event.targets.length) { event.current = event.targets.shift(); if (event.current.hasSha()) { event.current.chooseToUse( { name: "sha" }, "是否对" + get.translation(trigger.target) + "使用一张杀?", trigger.target, -1 ); } else { event.redo(); } } else { event.finish(); } "step 2"; if (!result.bool) { event.goto(1); } }, ai: { expose: 0.2, threaten: 1.4, }, }, husha: { trigger: { player: "phaseEnd" }, direct: true, filter: function (event, player) { if (player.storage.husha == 1) { return game.hasPlayer(function (current) { return player.canUse("sha", current, false); }); } else { return player.storage.husha > 0; } }, content: function () { "step 0"; var list = []; if ( game.hasPlayer(function (current) { return player.canUse("sha", current, false); }) ) { list.push("移去1枚虎煞标记,视为使用一张杀"); } if (player.storage.husha > 1) { list.push("移去2枚虎煞标记,视为使用一张南蛮入侵"); if (player.storage.husha > 2) { list.push("移去3枚虎煞标记,视为对除你之外的角色使用一张元素毁灭"); } } player .chooseControl("cancel2", function () { if (player.storage.husha > 2) { var num1 = game.countPlayer(function (current) { if (current != player && player.canUse("yuansuhuimie", current)) { return get.sgn( get.effect(current, { name: "yuansuhuimie" }, player, player) ); } }); var num2 = game.countPlayer(function (current) { if (current != player && player.canUse("yuansuhuimie", current)) { return get.effect(current, { name: "yuansuhuimie" }, player, player); } }); if (num1 > 0 && num2 > 0) return "选项三"; } if (player.storage.husha > 1) { var num = game.countPlayer(function (current) { if (current != player && player.canUse("nanman", current)) { return get.sgn( get.effect(current, { name: "nanman" }, player, player) ); } }); if (num > 0) return "选项二"; } if ( game.hasPlayer(function (current) { return ( player.canUse("sha", current, false) && get.effect(current, { name: "sha" }, player, player) > 0 ); }) ) { return "选项一"; } return "cancel2"; }) .set("prompt", get.prompt("husha")) .set("choiceList", list); "step 1"; if (result.control != "cancel2") { player.logSkill("husha"); if (result.control == "选项一") { event.sha = true; player.storage.husha--; player.chooseTarget("选择出杀的目标", true, function (card, player, target) { return player.canUse("sha", target, false); }).ai = function (target) { return get.effect(target, { name: "sha" }, player, player); }; } else if (result.control == "选项二") { var list = game.filterPlayer(function (current) { return player.canUse("nanman", current); }); player.storage.husha -= 2; list.sortBySeat(); player.useCard({ name: "nanman" }, list); } else { var list = game.filterPlayer(function (current) { return player.canUse("yuansuhuimie", current); }); player.storage.husha -= 3; list.remove(player); list.sortBySeat(); player.useCard({ name: "yuansuhuimie" }, list); } if (!player.storage.husha) { player.unmarkSkill("husha"); } else { player.syncStorage("husha"); player.updateMarks(); } } "step 2"; if (event.sha && result.targets && result.targets.length) { player.useCard({ name: "sha" }, result.targets[0]); } }, init: function (player) { player.storage.husha = 0; }, intro: { content: "mark", }, group: "husha_count", subSkill: { count: { trigger: { source: "damageEnd" }, forced: true, filter: function (event, player) { if (player.storage.husha < 3) { var evt = event.getParent("phaseUse"); return evt && evt.player == player; } return false; }, content: function () { player.storage.husha += trigger.num; if (player.storage.husha > 3) { player.storage.husha = 3; } player.markSkill("husha"); player.syncStorage("husha"); player.updateMarks(); }, }, }, }, fenshi: { unique: true, skillAnimation: true, animationColor: "fire", trigger: { player: "dyingAfter" }, forced: true, mark: true, derivation: "longhuo", intro: { content: "limited", }, content: function () { player.awakenSkill("fenshi"); player.changeHujia(2); player.draw(2); player.addSkill("longhuo"); }, }, longhuo: { unique: true, trigger: { player: "phaseEnd" }, check: function (event, player) { if (player.hp == 1 && player.hujia == 0) return false; var num = game.countPlayer(function (current) { var eff = get.sgn(get.damageEffect(current, player, player, "fire")); if (current.hp == 1 && current.hujia == 0) eff *= 1.5; return eff; }); return num > 0; }, content: function () { "step 0"; event.targets = get.players(lib.sort.seat); "step 1"; if (event.targets.length) { var current = event.targets.shift(); if (current.isIn()) { player.line(current, "fire"); current.damage("fire"); event.redo(); } } }, }, yanzhan: { enable: "phaseUse", viewAs: { name: "sha", nature: "fire" }, usable: 1, position: "he", viewAsFilter: function (player) { if (!player.countCards("he", { color: "red" })) return false; }, filterCard: { color: "red" }, check: function (card) { if (get.suit(card) == "heart") return 7 - get.value(card); return 5 - get.value(card); }, onuse: function (result) { if (result.targets) { for (var i = 0; i < result.targets.length; i++) { result.targets[i].addTempSkill("yanzhan3"); } } }, group: "yanzhan2", ai: { order: function () { return get.order({ name: "sha" }) + 0.15; }, }, }, yanzhan2: { trigger: { source: "damageEnd" }, forced: true, popup: false, filter: function (event) { return event.parent.skill == "yanzhan"; }, content: function () { player.addTempSkill("yanzhan4"); }, }, yanzhan3: { mod: { cardRespondable: function (card, player) { if ( _status.event.parent.skill == "yanzhan" && get.suit(card) != get.suit(_status.event.parent.cards[0]) ) return false; }, }, }, yanzhan4: { mod: { cardUsable: function (card, player, num) { if (card.name == "sha") return num + 1; }, }, }, xjyufeng: { trigger: { player: "loseEnd" }, forced: true, usable: 2, filter: function (event, player) { for (var i = 0; i < event.cards.length; i++) { if (event.cards[i].original == "h") return player.countCards("h") < 2; } return false; }, content: function () { player.draw(2 - player.countCards("h")); }, ai: { noh: true, skillTagFilter: function (player, tag) { var nh = player.countCards("h"); if (tag == "noh" && (nh > 2 || nh == 0)) { return false; } }, }, }, feixia: { enable: "phaseUse", usable: 1, filterCard: { color: "red" }, position: "he", filter: function (event, player) { return player.countCards("he", { color: "red" }) > 0; }, check: function (card) { return 7 - get.value(card); }, content: function () { var targets = player.getEnemies(); if (targets.length) { var target = targets.randomGet(); target.addExpose(0.2); player.useCard({ name: "sha" }, target, false); } }, ai: { order: 2.9, result: { player: 1, }, }, }, lueying: { trigger: { player: "shaBegin" }, filter: function (event, player) { if (event.target.countCards("he") > 0) { return game.hasPlayer(function (current) { return current != player && current != event.target && current.countCards("he"); }); } return false; }, logTarget: "target", usable: 1, content: function () { "step 0"; var card = trigger.target.getCards("he").randomGet(); player.gain(card, trigger.target); if (get.position(card) == "e") { trigger.target.$give(card, player); } else { trigger.target.$giveAuto(card, player); } "step 1"; if ( game.hasPlayer(function (current) { return current != player && current != trigger.target && current.countCards("he"); }) ) { trigger.target.chooseTarget(function (card, player, target) { return ( target != player && target != _status.event.parent.player && target.countCards("he") > 0 ); }, "选择一名角色并令" + get.translation(player) + "弃置其一张牌").ai = function ( target ) { return -get.attitude(_status.event.player, target); }; } else { event.finish(); } "step 2"; if (result.bool) { trigger.target.line(result.targets[0], "green"); player.discardPlayerCard(result.targets[0], true, "he"); } }, ai: { threaten: 1.5, expose: 0.2, }, }, tianjian: { enable: "phaseUse", viewAs: { name: "wanjian" }, filterCard: { name: "sha" }, filter: function (event, player) { return player.countCards("h", "sha") > 0; }, // alter:true, usable: 1, group: "tianjian_discard", subSkill: { discard: { trigger: { source: "damageEnd" }, forced: true, filter: function (event) { if (event._notrigger.includes(event.player)) return false; if (get.is.altered("tianjian")) return false; return event.parent.skill == "tianjian" && event.player.countCards("he"); }, popup: false, content: function () { trigger.player.discard(trigger.player.getCards("he").randomGet()); }, }, }, }, feng: { unique: true, init: function (player) { player.storage.feng = 0; }, mark: true, intro: { content: "已累计摸#次牌", }, trigger: { player: "drawBegin" }, forced: true, popup: false, priority: 5, content: function () { if (player.storage.feng < 2) { player.storage.feng++; } else { trigger.num++; player.storage.feng = 0; player.logSkill("feng"); } player.updateMarks(); }, }, ya: { unique: true, init: function (player) { player.storage.ya = 0; }, mark: true, intro: { content: "已累计受到#次伤害", }, trigger: { player: "damageBegin" }, filter: function (event, player) { if (player.storage.ya == 2) return event.num > 0; return true; }, forced: true, popup: false, content: function () { if (player.storage.ya < 2) { player.storage.ya++; } else if (trigger.num > 0) { trigger.num--; player.storage.ya = 0; player.logSkill("ya"); } player.updateMarks(); }, }, song: { unique: true, init: function (player) { player.storage.song = 0; }, mark: true, intro: { content: "已累计造成#次伤害", }, trigger: { source: "damageBegin" }, forced: true, popup: false, content: function () { if (player.storage.song < 2) { player.storage.song++; } else { trigger.num++; player.storage.song = 0; player.logSkill("song"); } player.updateMarks(); }, }, longxiang: { trigger: { player: "shaBegin" }, filter: function (event, player) { return event.target.countCards("h") > player.countCards("h"); }, check: function (event, player) { return get.attitude(player, event.target) < 0; }, logTarget: "target", content: function () { var hs = trigger.target.getCards("h"); trigger.target.discard(hs.randomGets(hs.length - player.countCards("h"))); }, }, huxi: { enable: "chooseToUse", viewAs: { name: "sha" }, precontent: function () { "step 0"; player.loseHp(); "step 1"; player.changeHujia(); }, filterCard: function () { return false; }, selectCard: -1, prompt: "失去1点体力并获得1点护甲,视为使用一张杀", ai: { order: function () { var player = _status.event.player; if (player.hp <= 2) return 0; return 2; }, skillTagFilter: function (player, tag, arg) { if (arg != "use") return false; }, respondSha: true, }, }, xuanmo: { enable: "phaseUse", usable: 1, filterCard: function (card) { var type = get.type(card, "trick"); return type == "basic" || type == "equip" || type == "trick"; }, check: function (card) { return 8 - get.value(card); }, filter: function (event, player) { return player.countCards("h") > 0; }, discard: false, prepare: "throw", content: function () { game.log(player, "将", cards, "置于牌堆顶"); ui.cardPile.insertBefore(cards[0], ui.cardPile.firstChild); var list = get.inpile(get.type(cards[0], "trick"), "trick").randomGets(2); for (var i = 0; i < list.length; i++) { list[i] = game.createCard(list[i]); } player.gain(list, "draw"); }, ai: { threaten: 1.5, order: 5, result: { player: 1, }, }, }, danqing: { trigger: { player: "phaseEnd" }, init: function (player) { player.storage.danqing = []; }, mark: true, direct: true, intro: { content: function (storage) { if (!storage.length) { return "未使用或打出过有花色的牌"; } else { var str = "已使用过" + get.translation(storage[0] + "2"); for (var i = 1; i < storage.length; i++) { str += "、" + get.translation(storage[i] + "2"); } str += "牌"; return str; } }, }, filter: function (event, player) { return player.storage.danqing.length == 4; }, ai: { threaten: 1.2, }, // alter:true, content: function () { "step 0"; player.storage.danqing.length = 0; player.updateMarks(); player.chooseTarget(get.prompt("danqing"), [1, get.is.altered("danqing") ? 2 : 4]).ai = function (target) { return get.attitude(player, target); }; "step 1"; if (result.bool) { player.logSkill("danqing", result.targets); for (var i = 0; i < result.targets.length; i++) { result.targets[i].getBuff(false); } } else { event.finish(); } "step 2"; game.delay(); }, group: "danqing_count", }, danqing_count: { trigger: { player: "useCard" }, silent: true, content: function () { var suit = get.suit(trigger.card); if (suit) { player.storage.danqing.add(suit); player.updateMarks(); } }, }, danqing_old: { content: function () { "step 0"; player.storage.danqing.length = 0; player.updateMarks(); event.targets = []; "step 1"; player.chooseTarget("令一名角色摸一张牌", function (card, player, target) { return !event.targets.includes(target); }).ai = function (target) { var att = get.attitude(player, target); if (att > 0) { return att + 1 / Math.sqrt(1 + target.countCards("h")); } return 0; }; "step 2"; if (result.bool) { player.line(result.targets[0], "green"); result.targets[0].draw(); event.targets.push(result.targets[0]); if (event.targets.length == game.players.length) { event.finish(); } else { player.chooseTarget("令一名角色获得1点护甲", function (card, player, target) { return !event.targets.includes(target); }).ai = function (target) { var att = get.attitude(player, target); if (att > 0) { return att + 1 / Math.sqrt(1 + target.hp); } return 0; }; } } else { event.finish(); } "step 3"; if (result.bool) { player.line(result.targets[0], "green"); result.targets[0].changeHujia(); game.delay(); event.targets.push(result.targets[0]); if (event.targets.length == game.players.length) { event.finish(); } else { player.chooseTarget( "令一名角色装备一件随机装备", function (card, player, target) { return !event.targets.includes(target); } ).ai = function (target) { var att = get.attitude(player, target); if (att > 0 && !target.getEquip(5)) { return att; } return 0; }; } } else { event.finish(); } "step 4"; if (result.bool) { player.line(result.targets[0], "green"); game.delay(); var list = []; for (var i = 0; i < lib.inpile.length; i++) { if (lib.card[lib.inpile[i]].type == "equip") { list.push(lib.inpile[i]); } } var card = game.createCard(list.randomGet()); result.targets[0].equip(card); result.targets[0].$draw(card); event.targets.push(result.targets[0]); if (event.targets.length == game.players.length) { event.finish(); } else { player.chooseTarget("令一名角色获得潜行", function (card, player, target) { return !event.targets.includes(target); }).ai = function (target) { var att = get.attitude(player, target); if (att > 0) { return att + 1 / Math.sqrt(1 + target.hp); } return 0; }; } } else { event.finish(); } "step 5"; if (result.bool) { player.line(result.targets[0], "green"); game.delay(); result.targets[0].tempHide(); } }, }, sheling: { trigger: { global: ["useCardAfter", "respondAfter", "discardAfter"] }, filter: function (event, player) { if (player != _status.currentPhase || player == event.player) return false; if (event.cards) { for (var i = 0; i < event.cards.length; i++) { if (get.position(event.cards[i]) == "d") return true; } } return false; }, frequent: "check", check: function (event) { for (var i = 0; i < event.cards.length; i++) { if (get.position(event.cards[i]) == "d" && event.cards[i].name == "du") return false; } return true; }, usable: 3, content: function () { var cards = []; for (var i = 0; i < trigger.cards.length; i++) { if (get.position(trigger.cards[i]) == "d") { cards.push(trigger.cards[i]); } } player.gain(cards, "gain2"); }, }, zhaoyao: { trigger: { global: "phaseDrawBegin" }, filter: function (event, player) { return ( event.player != player && event.player.countCards("h") > 0 && player.countCards("h") > 0 ); }, check: function (event, player) { if (player.isUnseen()) return false; if (get.attitude(player, event.player) >= 0) return false; var hs = player.getCards("h"); if (hs.length < event.player.countCards("h")) return false; for (var i = 0; i < hs.length; i++) { var val = get.value(hs[0]); if (hs[i].number >= 10 && val <= 6) return true; if (hs[i].number >= 8 && val <= 3) return true; } return false; }, logTarget: "player", content: function () { "step 0"; player.chooseToCompare(trigger.player); "step 1"; if (result.bool) { player.draw(2); } else { event.finish(); } "step 2"; player.chooseCard("将两张牌置于牌堆顶(先选择的在上)", 2, "he", true); "step 3"; if (result.bool) { player.lose(result.cards, ui.special); event.cards = result.cards; } else { event.finish(); } "step 4"; game.delay(); var nodes = []; for (var i = 0; i < event.cards.length; i++) { var cardx = ui.create.card(); cardx.classList.add("infohidden"); cardx.classList.add("infoflip"); nodes.push(cardx); } player.$throw(nodes, 700, "nobroadcast"); game.log(player, "将" + get.cnNumber(event.cards.length) + "张牌置于牌堆顶"); "step 5"; for (var i = event.cards.length - 1; i >= 0; i--) { ui.cardPile.insertBefore(event.cards[i], ui.cardPile.firstChild); } }, ai: { mingzhi: false, expose: 0.2, }, }, zhangmu: { trigger: { player: ["chooseToRespondBegin", "chooseToUseBegin"] }, filter: function (event, player) { if (event.responded) return false; if (!event.filterCard({ name: "shan" }, player, event)) return false; return player.countCards("h", "shan") > 0; }, direct: true, usable: 1, content: function () { "step 0"; var goon = get.damageEffect(player, trigger.player, player) <= 0; player.chooseCard(get.prompt("zhangmu"), { name: "shan" }).ai = function () { return goon ? 1 : 0; }; "step 1"; if (result.bool) { player.logSkill("zhangmu"); player.showCards(result.cards); trigger.untrigger(); trigger.responded = true; trigger.result = { bool: true, card: { name: "shan" } }; player.addSkill("zhangmu_ai"); } else { player.storage.counttrigger.zhangmu--; } }, ai: { respondShan: true, effect: { target: function (card, player, target, effect) { if (get.tag(card, "respondShan") && effect < 0) { if (target.hasSkill("zhangmu_ai")) return 0; if (target.countCards("h") >= 2) return 0.5; } }, }, }, }, zhangmu_ai: { trigger: { player: "loseAfter" }, silent: true, filter: function (event, player) { return player.countCards("h", "shan") == 0; }, content: function () { player.removeSkill("zhangmu_ai"); }, }, leiyu: { trigger: { player: "phaseEnd" }, direct: true, filter: function (event, player) { if (!player.countCards("h", { color: "black" })) return false; if (player.storage.leiyu) { for (var i = 0; i < player.storage.leiyu.length; i++) { if (player.storage.leiyu[i].isAlive()) return true; } } return false; }, content: function () { "step 0"; for (var i = 0; i < player.storage.leiyu.length; i++) { if (player.storage.leiyu[i].isDead()) { player.storage.leiyu.splice(i--, 1); } } var num = 0; var num2 = 0; for (var i = 0; i < player.storage.leiyu.length; i++) { if (!player.storage.leiyu[i].isIn()) continue; var eff = get.effect( player.storage.leiyu[i], { name: "jingleishan", nature: "thunder" }, player, player ); num += eff; if (eff > 0) { num2++; } else if (eff < 0) { num2--; } } var next = player.chooseToDiscard(get.prompt("leiyu", player.storage.leiyu), { color: "black", }); next.ai = function (card) { if (num > 0 && num2 >= 2) { return 7 - get.value(card); } return 0; }; next.logSkill = ["leiyu", player.storage.leiyu]; "step 1"; if (result.bool) { player.storage.leiyu.sort(lib.sort.seat); player.useCard( { name: "jingleishan", nature: "thunder" }, player.storage.leiyu ).animate = false; } }, group: ["leiyu2", "leiyu4"], ai: { threaten: 1.3, }, }, leiyu2: { trigger: { player: "phaseUseBegin" }, silent: true, content: function () { player.storage.leiyu = []; }, }, leiyu3: { trigger: { source: "dieAfter" }, forced: true, popup: false, filter: function (event, player) { return player.storage.leiyu2 ? true : false; }, content: function () { player.recover(); delete player.storage.leiyu2; }, }, leiyu4: { trigger: { player: "useCardToBegin" }, silent: true, filter: function (event, player) { return ( _status.currentPhase == player && Array.isArray(player.storage.leiyu) && event.target && event.target != player ); }, content: function () { player.storage.leiyu.add(trigger.target); }, }, feizhua: { trigger: { player: "useCard" }, filter: function (event, player) { if (event.card.name != "sha") return false; if (event.targets.length != 1) return false; var target = event.targets[0]; var players = game.filterPlayer(function (current) { return get.distance(target, current, "pure") == 1; }); for (var i = 0; i < players.length; i++) { if ( player != players[i] && target != players[i] && player.canUse("sha", players[i], false) ) { return true; } } return false; }, prompt: function (event, player) { var targets = []; var target = event.targets[0]; var players = game.filterPlayer(function (current) { return get.distance(target, current, "pure") == 1; }); for (var i = 0; i < players.length; i++) { if ( player != players[i] && target != players[i] && player.canUse("sha", players[i], false) ) { targets.push(players[i]); } } return get.prompt("feizhua", targets); }, check: function (event, player) { var target = event.targets[0]; var num = 0; var players = game.filterPlayer(function (current) { return get.distance(target, current, "pure") == 1; }); for (var i = 0; i < players.length; i++) { if ( player != players[i] && target != players[i] && player.canUse("sha", players[i], false) ) { num += get.effect(players[i], { name: "sha" }, player, player); } } return num > 0; }, content: function () { "step 0"; var target = trigger.targets[0]; var players = game.filterPlayer(function (current) { return get.distance(target, current, "pure") == 1; }); for (var i = 0; i < players.length; i++) { if ( player != players[i] && target != players[i] && player.canUse("sha", players[i], false) ) { trigger.targets.push(players[i]); player.line(players[i], "green"); } } }, }, lingxue: { trigger: { player: "recoverEnd" }, forced: true, content: function () { player.changeHujia(); }, }, diesha: { trigger: { source: "damageEnd" }, forced: true, filter: function (event) { if (event._notrigger.includes(event.player)) return false; return event.player.isAlive() && event.card && event.card.name == "sha"; }, content: function () { trigger.player.loseHp(); player.recover(); }, ai: { threaten: 1.5, }, }, guijiang: { enable: "phaseUse", usable: 1, filterTarget: function (card, player, target) { return target != player && !target.hasSkill("guijiang2"); }, filterCard: { color: "black" }, filter: function (event, player) { return player.countCards("h", { color: "black" }); }, check: function (card) { return 5 - get.value(card); }, content: function () { target.addSkill("guijiang2"); target.storage.guijiang2 = player; }, ai: { order: 4, threaten: 1.2, expose: 0.2, result: { target: function (player, target) { if (target.hp == 1) return -1; if (target.hp == 2) return -0.5; return 0; }, }, }, }, guijiang2: { mark: true, intro: { content: "不能成为回复牌的目标", }, trigger: { global: ["dieBegin", "phaseBegin"] }, forced: true, popup: false, filter: function (event, player) { return event.player == player.storage.guijiang2; }, content: function () { player.removeSkill("guijiang2"); }, mod: { targetEnabled: function (card) { if (get.tag(card, "recover")) return false; }, }, global: "guijiang3", }, guijiang3: { mod: { cardSavable: function (card, player) { if (_status.event.dying && _status.event.dying.hasSkill("guijiang2")) return false; }, }, }, fenxing: { trigger: { player: "phaseBegin" }, forced: true, unique: true, forceunique: true, filter: function () { return Math.random() < 0.5; }, derivation: ["diesha", "guijiang"], content: function () { if (player.storage.fenxing) { player.storage.fenxing = false; player.removeSkill("guijiang"); player.removeSkill("diesha"); player.addSkill("diewu"); player.addSkill("lingyu"); player.setAvatar("pal_longkui", "pal_longkui"); } else { player.storage.fenxing = true; player.removeSkill("diewu"); player.removeSkill("lingyu"); player.addSkill("guijiang"); player.addSkill("diesha"); player.setAvatar("pal_longkui", "pal_longkuigui"); } }, }, diewu: { enable: "phaseUse", filter: function (event, player) { return player.countCards("h", "sha") > 0; }, filterCard: { name: "sha" }, filterTarget: function (card, player, target) { return target != player; }, prepare: "give", discard: false, content: function () { target.gain(cards, player); if (!player.hasSkill("diewu2")) { player.draw(); player.addTempSkill("diewu2"); } }, ai: { order: 2, expose: 0.2, result: { target: function (player, target) { if (!player.hasSkill("diewu2")) return 1; return 0; }, }, }, }, diewu2: {}, lingyu: { trigger: { player: "phaseEnd" }, direct: true, filter: function (event, player) { return game.hasPlayer(function (current) { return current != player && current.isDamaged(); }); }, content: function () { "step 0"; player.chooseTarget("灵愈:令一名其他角色回复1点体力", function (card, player, target) { return target != player && target.hp < target.maxHp; }).ai = function (target) { return get.recoverEffect(target, player, player); }; "step 1"; if (result.bool) { player.logSkill("lingyu", result.targets[0]); result.targets[0].recover(); } }, ai: { threaten: 1.5, expose: 0.2, }, }, duxinshu: { enable: "phaseUse", usable: 1, filterTarget: function (card, player, target) { return target != player && target.countCards("h"); }, content: function () { "step 0"; if (player.countCards("h")) { player.chooseCardButton("读心", target.getCards("h")).ai = function (button) { return get.value(button.link) - 5; }; } else { player.viewHandcards(target); event.finish(); } "step 1"; if (result.bool) { event.card = result.links[[0]]; player.chooseCard("h", true, "用一张手牌替换" + get.translation(event.card)).ai = function (card) { return -get.value(card); }; } else { event.finish(); } "step 2"; if (result.bool) { player.gain(event.card, target); target.gain(result.cards, player); player.$giveAuto(result.cards, target); target.$giveAuto(event.card, player); game.log(player, "与", target, "交换了一张手牌"); } }, ai: { threaten: 1.3, result: { target: function (player, target) { return -target.countCards("h"); }, }, order: 10, expose: 0.2, }, }, feixu: { trigger: { global: ["useCard", "respond"] }, filter: function (event, player) { return event.card && event.card.name == "shan"; }, check: function (event, player) { return get.attitude(player, event.player) > 0; }, logTarget: "player", content: function () { trigger.player.draw(); }, ai: { mingzhi: false, threaten: 2, expose: 0.2, }, }, xuanyan: { // trigger:{source:'damageBefore'}, // forced:true, // priority:5, // check:function(event,player){ // return player.hp>3; // }, // filter:function(event){ // return event.card&&get.color(event.card)=='red'; // }, // content:function(){ // trigger.nature='fire'; // }, group: ["xuanyan2", "xuanyan3"], }, xuanyan2: { trigger: { source: "damageBegin" }, forced: true, filter: function (event) { return event.hasNature("fire") && event.notLink(); }, content: function () { trigger.num++; }, }, xuanyan3: { trigger: { source: "damageEnd" }, forced: true, popup: false, filter: function (event) { return event.hasNature("fire"); }, content: function () { player.loseHp(); }, }, ningbin: { trigger: { player: "damageEnd" }, forced: true, filter: function (event) { return event.hasNature("thunder"); }, content: function () { player.recover(); }, ai: { effect: { target: function (card, player, target) { if (get.tag(card, "thunderDamage")) { if (target.hp <= 1 || !target.hasSkill("xfenxin")) return [0, 0]; return [0, 1.5]; } }, }, }, }, xfenxin: { trigger: { player: "changeHp" }, forced: true, filter: function (event) { return event.num != 0; }, // alter:true, content: function () { if (get.is.altered("xfenxin")) { player.draw(); } else { player.draw(Math.abs(trigger.num)); } }, ai: { effect: { target: function (card) { if (get.tag(card, "thunderDamage")) return; if (get.tag(card, "damage") || get.tag(card, "recover")) { return [1, 0.2]; } }, }, }, group: "xfenxin2", }, xfenxin2: { trigger: { source: "dieAfter" }, forced: true, filter: function () { return !get.is.altered("xfenxin"); }, content: function () { player.gainMaxHp(); player.recover(); }, }, luanjian: { enable: "phaseUse", filterCard: { name: "sha" }, selectCard: 2, check: function (card) { var num = 0; var player = _status.event.player; var players = game.filterPlayer(); for (var i = 0; i < players.length; i++) { if ( lib.filter.targetEnabled({ name: "sha" }, player, players[i]) && get.effect(players[i], { name: "sha" }, player) > 0 ) { num++; if (num > 1) return 8 - get.value(card); } } return 0; }, viewAs: { name: "sha" }, selectTarget: [1, Infinity], filterTarget: function (card, player, target) { return lib.filter.targetEnabled({ name: "sha" }, player, target); }, ai: { order: function () { return get.order({ name: "sha" }) + 0.1; }, effect: { player: function (card, player) { if (_status.currentPhase != player) return; if ( card.name == "sha" && player.countCards("h", "sha") < 2 && !player.needsToDiscard() ) { var num = 0; var player = _status.event.player; var players = game.filterPlayer(); for (var i = 0; i < players.length; i++) { if ( lib.filter.targetEnabled({ name: "sha" }, player, players[i]) && get.attitude(player, players[i]) < 0 ) { num++; if (num > 1) return "zeroplayertarget"; } } } }, }, }, group: "luanjian2", }, luanjian2: { trigger: { source: "damageBegin" }, forced: true, popup: false, filter: function (event, player) { return event.card && event.card.name == "sha" && event.parent.skill == "luanjian"; }, content: function () { if (Math.random() < 0.5) trigger.num++; }, }, ctianfu: { enable: "phaseUse", filter: function (event, player) { return player.countCards("h", "shan") > 0; }, usable: 1, filterCard: { name: "shan" }, discard: false, prepare: "give", filterTarget: function (card, player, target) { return target != player && !target.hasSkill("ctianfu2"); }, check: function (card) { if (_status.event.player.hp >= 3) return 8 - get.value(card); return 7 - get.value(card); }, content: function () { target.storage.ctianfu2 = cards[0]; target.storage.ctianfu3 = player; game.addVideo("storage", target, ["ctianfu2", get.cardInfo(cards[0]), "card"]); target.addSkill("ctianfu2"); }, ai: { order: 2, result: { target: function (player, target) { var att = get.attitude(player, target); if (att >= 0) return 0; return get.damageEffect(target, player, target, "thunder"); }, }, expose: 0.2, }, }, ctianfu2: { trigger: { source: "damageAfter" }, forced: true, mark: "card", filter: function (event, player) { return player.storage.ctianfu2 && player.storage.ctianfu3; }, content: function () { "step 0"; if (player.storage.ctianfu3 && player.storage.ctianfu3.isAlive()) { player.damage(player.storage.ctianfu3); player.storage.ctianfu3.line(player, "thunder"); } else { player.damage("nosource"); } "step 1"; var he = player.getCards("he"); if (he.length) { player.discard(he.randomGet()); } "step 2"; player.$throw(player.storage.ctianfu2); player.storage.ctianfu2.discard(); delete player.storage.ctianfu2; delete player.storage.ctianfu3; player.removeSkill("ctianfu2"); }, group: "ctianfu3", intro: { content: "card", }, }, ctianfu3: { trigger: { player: "dieBegin" }, forced: true, popup: false, content: function () { player.storage.ctianfu2.discard(); delete player.storage.ctianfu2; delete player.storage.ctianfu3; player.removeSkill("ctianfu2"); }, }, shuiyun: { trigger: { player: "phaseEnd" }, direct: true, init: function (player) { player.storage.shuiyun = []; player.storage.shuiyun_count = 0; }, // alter:true, filter: function (event, player) { if (player.storage.shuiyun.length >= 3) return false; if (player.storage.shuiyun.length >= 2 && get.is.altered("shuiyun")) return false; var types = []; for (var i = 0; i < player.storage.shuiyun.length; i++) { types.add(get.type(player.storage.shuiyun[i], "trick")); } var cards = player.getCards("h"); for (var i = 0; i < cards.length; i++) { if (!types.includes(get.type(cards[i], "trick"))) { return true; } } return false; }, content: function () { "step 0"; var types = []; var num = player.countCards("h"); for (var i = 0; i < player.storage.shuiyun.length; i++) { types.add(get.type(player.storage.shuiyun[i], "trick")); } player.chooseCard(get.prompt2("shuiyun"), function (card) { return !types.includes(get.type(card, "trick")); }).ai = function (card) { return 11 - get.value(card); }; "step 1"; if (result.bool) { player.$throw(result.cards); var clone = result.cards[0].clone; setTimeout(function () { clone.moveDelete(player); game.addVideo("gain2", player, get.cardsInfo([clone])); }, 500); player.logSkill("shuiyun"); player.storage.shuiyun.push(result.cards[0]); player.lose(result.cards, ui.special); player.markSkill("shuiyun"); game.addVideo("storage", player, [ "shuiyun", get.cardsInfo(player.storage.shuiyun), "cards", ]); } }, intro: { content: "cards", onunmark: function (storage, player) { if (storage && storage.length) { for (var i = 0; i < storage.length; i++) { storage[i].discard(); } player.$throw(storage); delete player.storage.shuiyun; } }, }, ai: { effect: { player: function (card, player) { if (_status.currentPhase != player) return; if (get.is.altered("shuiyun")) return; if ( card.name == "wuzhong" || card.name == "yiyi" || card.name == "yuanjiao" || card.name == "shunshou" ) return; if (!player.needsToDiscard()) { var types = []; for (var i = 0; i < player.storage.shuiyun.length; i++) { types.add(get.type(player.storage.shuiyun[i], "trick")); } if (!types.includes(get.type(card, "trick"))) { return "zeroplayertarget"; } } }, }, threaten: 2.2, }, group: ["shuiyun5"], }, shuiyun5: { enable: "chooseToUse", filter: function (event, player) { return ( event.type == "dying" && event.dying && event.dying.hp <= 0 && player.storage.shuiyun.length > 0 ); }, filterTarget: function (card, player, target) { return target == _status.event.dying; }, delay: 0, selectTarget: -1, content: function () { "step 0"; player.chooseCardButton(get.translation("shuiyun"), player.storage.shuiyun, true); "step 1"; if (result.bool) { player.storage.shuiyun.remove(result.links[0]); if (!player.storage.shuiyun.length) { player.unmarkSkill("shuiyun"); } player.$throw(result.links); result.links[0].discard(); target.recover(); if (typeof player.storage.shuiyun_count == "number") { player.storage.shuiyun_count++; } player.syncStorage("shuiyun"); } else { event.finish(); } }, ai: { order: 6, skillTagFilter: function (player) { return player.storage.shuiyun.length > 0; }, save: true, result: { target: 3, }, threaten: 1.6, }, }, wangyou: { trigger: { global: "phaseEnd" }, unique: true, gainable: true, direct: true, filter: function (event, player) { if (!player.countCards("he")) return false; if (player == event.player) return false; return game.hasPlayer(function (current) { return current.hasSkill("wangyou3"); }); }, content: function () { "step 0"; var targets = []; var num = 0; var players = game.filterPlayer(); for (var i = 0; i < players.length; i++) { if (players[i].hasSkill("wangyou3")) { var att = get.attitude(player, players[i]); if (att > 0) num++; else if (att < 0) num--; targets.push(players[i]); } } event.targets = targets; var next = player.chooseToDiscard(get.prompt("wangyou", targets), "he"); next.logSkill = ["wangyou", event.targets]; next.ai = function (card) { if (num <= 0) return 0; switch (num) { case 1: return 5 - get.value(card); case 2: return 7 - get.value(card); default: return 8 - get.value(card); } }; "step 1"; if (result.bool) { event.targets.sort(lib.sort.seat); game.asyncDraw(event.targets); } else { event.finish(); } }, ai: { expose: 0.1, threaten: 1.2, }, group: "wangyou2", }, wangyou2: { trigger: { global: "damageEnd" }, silent: true, filter: function (event) { return event.player.isAlive(); }, content: function () { trigger.player.addTempSkill("wangyou3"); }, }, wangyou3: {}, changnian: { forbid: ["boss"], trigger: { player: "dieBegin" }, direct: true, unique: true, derivation: "changnian2", content: function () { "step 0"; player.chooseTarget(get.prompt("changnian"), function (card, player, target) { return player != target; }).ai = function (target) { return get.attitude(player, target); }; "step 1"; if (result.bool) { var cards = player.getCards("hej"); var target = result.targets[0]; // if(player.storage.shuiyun&&player.storage.shuiyun.length){ // target.gainMaxHp(); // target.recover(player.storage.shuiyun.length); // cards=cards.concat(player.storage.shuiyun); // player.storage.shuiyun.length=0; // } player.$give(cards, target); target.gain(cards); target.addSkill("changnian2"); player.logSkill("changnian", target); target.marks.changnian = target.markCharacter(player, { name: "长念", content: '
【追思】
锁定技,结束阶段,你摸一张牌
', }); game.addVideo("markCharacter", target, { name: "长念", content: '
【追思】
锁定技,结束阶段,你摸一张牌
', id: "changnian", target: player.dataset.position, }); } }, ai: { threaten: 0.8, }, }, changnian2: { trigger: { player: "phaseEnd" }, forced: true, nopop: true, content: function () { player.draw(); }, }, sajin: { enable: "phaseUse", filterTarget: function (card, player, target) { return target.hp < target.maxHp; }, selectTarget: [1, Infinity], filterCard: true, usable: 1, check: function (card) { var player = _status.currentPhase; if (player.countCards("h") > player.hp) { return 7 - get.value(card); } return 4 - get.value(card); }, content: function () { "step 0"; var color = get.color(cards[0]); target.judge(function (card) { return get.color(card) == color ? 1 : 0; }); "step 1"; if (result.bool) { target.recover(); } }, ai: { order: 3, result: { target: function (player, target) { return get.recoverEffect(target); }, }, threaten: 1.5, }, }, jtjubao: { trigger: { global: "discardAfter" }, filter: function (event, player) { if (player.hasSkill("jtjubao2")) return false; if (event.player == player) return false; if (_status.currentPhase == player) return false; for (var i = 0; i < event.cards.length; i++) { if (get.type(event.cards[i]) != "basic" && get.position(event.cards[i]) == "d") { return true; } } return false; }, frequent: true, content: function () { "step 0"; if (trigger.delay == false) game.delay(); "step 1"; var cards = []; for (var i = 0; i < trigger.cards.length; i++) { if (get.type(trigger.cards[i]) != "basic" && get.position(trigger.cards[i]) == "d") { cards.push(trigger.cards[i]); } } if (cards.length) { var card = cards.randomGet(); player.gain(card, "log"); player.$gain2(card); player.addTempSkill("jtjubao2"); } }, ai: { threaten: 1.5, }, }, jtjubao2: {}, duci: { trigger: { player: "loseEnd" }, direct: true, filter: function (event, player) { for (var i = 0; i < event.cards.length; i++) { if (event.cards[i].original == "e") return true; } return false; }, content: function () { "step 0"; player.chooseTarget(get.prompt("duci"), function (card, player, target) { return player != target && get.distance(player, target) <= 1; }).ai = function (target) { return get.damageEffect(target, player, player); }; "step 1"; if (result.bool) { player.logSkill("duci", result.targets); result.targets[0].damage(); } }, ai: { expose: 0.2, threaten: 1.5, effect: { target: function (card, player, target, current) { if (get.type(card) == "equip") { var players = game.filterPlayer(); for (var i = 0; i < players.length; i++) { if ( player != players[i] && get.distance(player, players[i]) <= 1 && get.damageEffect(players[i], player, player) > 0 ) { return [1, 3]; } } } }, }, }, }, xshuangren: { trigger: { player: ["loseEnd"] }, filter: function (event, player) { if (!player.equiping) return false; for (var i = 0; i < event.cards.length; i++) { if (event.cards[i].original == "e" && get.subtype(event.cards[i]) == "equip1") return true; } return false; }, content: function () { var card; for (var i = 0; i < trigger.cards.length; i++) { if (trigger.cards[i].original == "e" && get.subtype(trigger.cards[i]) == "equip1") { card = trigger.cards[i]; } } if (card) { if (player.storage.xshuangren) { player.unmark(player.storage.xshuangren, "xshuangren"); player.discard(player.storage.xshuangren); game.addVideo("unmarkId", player, [ get.cardInfo(player.storage.xshuangren), "xshuangren", ]); } if (card.clone) { card.clone.moveDelete(player); game.addVideo("gain2", player, get.cardsInfo([card.clone])); player.mark(card, "xshuangren"); game.addVideo("markId", player, [get.cardInfo(card), "xshuangren"]); } ui.special.appendChild(card); player.storage.xshuangren = card; var info = get.info(card); if (info.skills) { player.addAdditionalSkill("xshuangren", info.skills); } else { player.removeAdditionalSkill("xshuangren"); } } }, ai: { effect: { target: function (card, player, target, current) { if (get.subtype(card) == "equip1") return [1, 3]; }, }, }, intro: { content: "card", }, group: "xshuangren2", }, xshuangren2: { trigger: { player: "dieBegin" }, silent: true, filter: function (event, player) { return player.storage.xshuangren ? true : false; }, content: function () { if (player.storage.xshuangren) { player.storage.xshuangren.discard(); player.$throw(player.storage.xshuangren); } }, }, guiyuan: { enable: "phaseUse", usable: 1, filterCard: { name: "sha" }, filter: function (event, player) { return player.hp < player.maxHp; }, content: function () { player.recover(); player.draw(); }, ai: { order: 5, result: { player: 1, }, }, }, qijian: { trigger: { player: "phaseDiscardEnd" }, direct: true, filter: function (event, player) { return event.cards && event.cards.length > 0; }, content: function () { "step 0"; player.chooseTarget( [1, trigger.cards.length], get.prompt("qijian"), function (card, player, target) { return player.canUse({ name: "sha" }, target, false); } ).ai = function (target) { return get.effect(target, { name: "sha" }, player); }; "step 1"; if (result.bool) { player.logSkill("qijian"); player.useCard({ name: "sha" }, result.targets); } }, }, shenmu: { trigger: { global: "dying" }, priority: 6, filter: function (event, player) { return event.player.hp <= 0 && player.countCards("h", { color: "red" }); }, check: function (event, player) { if (get.attitude(player, event.player) <= 0) return false; var cards = player.getCards("h", { color: "red" }); for (var i = 0; i < cards.length; i++) { if (cards[i].name == "tao") return false; if (get.value(cards[i]) > 7 && cards.length > 2) return false; } }, content: function () { "step 0"; player.showHandcards(); "step 1"; var cards = player.getCards("h", { color: "red" }); event.num = cards.length; player.discard(cards); "step 2"; trigger.player.recover(); trigger.player.draw(event.num); }, ai: { threaten: 1.6, expose: 0.2, }, }, qianfang: { trigger: { player: "phaseBegin" }, direct: true, filter: function (event, player) { return player.storage.xuanning && player.countCards("he") + player.storage.xuanning >= 3; }, // alter:true, content: function () { "step 0"; // trigger.cancel(); var ainum = 0; var num = 3 - player.storage.xuanning; var players = game.filterPlayer(); event.targets = []; for (var i = 0; i < players.length; i++) { if ( players[i] != player && !players[i].isOut() && lib.filter.targetEnabled({ name: "wanjian" }, player, players[i]) ) { ainum += get.effect(players[i], { name: "wanjian" }); event.targets.push(players[i]); } } if (num) { var next = player.chooseToDiscard(num, get.prompt2("qianfang"), "he"); next.ai = function (card) { if (ainum >= 0) { switch (num) { case 1: return 8 - get.value(card); case 2: return 6 - get.value(card); case 3: return 4 - get.value(card); } } return -1; }; next.logSkill = "qianfang"; event.logged = true; } else { player.chooseBool(get.prompt2("qianfang")).ai = function () { return ainum >= 0; }; } "step 1"; if (result.bool) { player.storage.xuanning = 0; player.unmarkSkill("xuanning"); if (!event.logged) { player.logSkill("qianfang"); } player.useCard({ name: "wanjian" }, "qianfang", event.targets); } else { event.finish(); } }, ai: { expose: 0.1, threaten: 1.5, }, group: "qianfang_draw", subSkill: { draw: { trigger: { source: "damageEnd" }, forced: true, filter: function (event, player) { if (event._notrigger.includes(event.player)) return false; if (!event.player.isEnemiesOf(player)) return false; return event.parent.skill == "qianfang"; }, popup: false, content: function () { player.draw(); }, }, }, }, qianfang2: { trigger: { player: "phaseDrawBegin" }, forced: true, popup: false, content: function () { trigger.num++; }, }, poyun: { trigger: { source: "damageEnd" }, // alter:true, filter: function (event, player) { if (event._notrigger.includes(event.player)) return false; return player.storage.xuanning > 0 && event.player.countCards("he") > 0; }, direct: true, content: function () { "step 0"; player.discardPlayerCard(trigger.player, "he", get.prompt("poyun", trigger.player), [ 1, get.is.altered("poyun") ? 1 : 2, ]).logSkill = ["poyun", trigger.player]; "step 1"; if (result.bool) { player.storage.xuanning--; if (!player.storage.xuanning) { player.unmarkSkill("xuanning"); } player.syncStorage("xuanning"); } }, ai: { threaten: 1.3, }, }, poyun2: { trigger: { source: "damageEnd" }, forced: true, popup: false, filter: function (event, player) { return player.storage.poyun ? true : false; }, content: function () { player.draw(); player.storage.poyun = false; player.removeSkill("poyun2"); }, }, poyun3: {}, zhuyue: { enable: "phaseUse", // alter:true, filter: function (event, player) { if (get.is.altered("zhuyue")) { return player.hasCard(function (card) { return get.color(card) == "black" && get.type(card) != "basic"; }); } return player.countCards("h", { type: "basic" }) < player.countCards("he"); }, init: function (player) { player.storage.zhuyue = []; }, filterCard: function (card) { if (get.is.altered("zhuyue")) { return get.type(card) != "basic" && get.color(card) == "black"; } else { return get.type(card) != "basic"; } }, selectTarget: [1, 2], filterTarget: function (card, player, target) { return player != target && target.countCards("he") > 0; }, usable: 1, locked: false, check: function (card) { return 7 - get.value(card); }, multitarget: true, multiline: true, content: function () { "step 0"; targets.sort(lib.sort.seat); var target = targets[0]; var cs = target.getCards("he"); if (cs.length) { target.discard(cs.randomGet()); } player.storage.zhuyue.add(target); if (targets.length < 2) { event.finish(); } "step 1"; var target = targets[1]; var cs = target.getCards("he"); if (cs.length) { target.discard(cs.randomGet()); } player.storage.zhuyue.add(target); }, ai: { result: { target: function (player, target) { if (!target.countCards("he")) return -0.2; return -1; }, }, order: 10, threaten: 1.2, exoise: 0.2, }, mod: { targetInRange: function (card, player, target) { if ( card.name == "sha" && player.storage.zhuyue && player.storage.zhuyue.includes(target) ) { return true; } }, selectTarget: function (card, player, range) { if (card.name == "sha" && player.storage.zhuyue && player.storage.zhuyue.length) { range[1] = -1; range[0] = -1; } }, playerEnabled: function (card, player, target) { if ( card.name == "sha" && player.storage.zhuyue && player.storage.zhuyue.length && !player.storage.zhuyue.includes(target) ) { return false; } }, }, intro: { content: "players", }, group: "zhuyue2", }, zhuyue2: { trigger: { player: "phaseUseEnd" }, silent: true, content: function () { player.storage.zhuyue.length = 0; }, }, longxi: { trigger: { player: ["chooseToRespondBegin", "chooseToUseBegin"] }, forced: true, popup: false, max: 2, filter: function (event, player) { return _status.currentPhase != player; }, priority: 101, content: function () { var cards = []; var max = Math.min(ui.cardPile.childNodes.length, lib.skill.longxi.max); for (var i = 0; i < max; i++) { var card = ui.cardPile.childNodes[i]; if (trigger.filterCard(card, player, trigger)) { cards.push(card); } } if (cards.length) { player.gain(cards, "draw"); player.logSkill("longxi"); game.log(player, "获得了" + get.cnNumber(cards.length) + "张牌"); } }, ai: { respondSha: true, respondShan: true, effect: { target: function (card, player, target, effect) { if (get.tag(card, "respondShan")) return 0.7; if (get.tag(card, "respondSha")) return 0.7; }, }, }, hiddenCard: function (player, name) { if (_status.currentPhase == player) return false; var max = Math.min(ui.cardPile.childNodes.length, lib.skill.longxi.max); for (var i = 0; i < max; i++) { var card = ui.cardPile.childNodes[i]; if (card.name == name) return true; } return false; }, }, guanri: { unique: true, enable: "phaseUse", filter: function (event, player) { return !player.storage.guanri && player.countCards("h", { color: "red" }) >= 2; }, check: function (card) { return 8 - get.value(card); }, filterCard: function (card) { return get.color(card) == "red"; }, selectCard: 2, filterTarget: function (card, player, target) { return player != target && target.hp >= player.hp; }, intro: { content: "limited", }, line: "fire", content: function () { "step 0"; player.storage.guanri = true; player.loseHp(); "step 1"; target.damage(2, "fire"); "step 2"; if (target.isAlive()) { target.discard(target.getCards("e")); } }, ai: { order: 1, result: { target: function (player, target) { var eff = get.damageEffect(target, player, target, "fire"); if (player.hp > 2) return eff; if (player.hp == 2 && target.hp == 2) return eff; return 0; }, }, expose: 0.5, }, }, tianxian: { mod: { targetInRange: function (card, player, target, now) { if (card.name == "sha") return true; }, selectTarget: function (card, player, range) { if (card.name == "sha" && range[1] != -1) range[1] = Infinity; }, }, priority: 5.5, trigger: { player: "useCardToBefore" }, filter: function (event) { return event.card.name == "sha"; }, forced: true, check: function () { return false; }, content: function () { "step 0"; trigger.target.judge(function (card) { return get.color(card) == "black" ? 1 : 0; }); "step 1"; if (result.bool) { trigger.cancel(); } }, }, runxin: { trigger: { player: ["useCard", "respondEnd"] }, direct: true, filter: function (event) { if (get.suit(event.card) == "heart") { return game.hasPlayer(function (current) { return current.isDamaged(); }); } return false; }, content: function () { "step 0"; var noneed = trigger.card.name == "tao" && trigger.targets[0] == player && player.hp == player.maxHp - 1; player .chooseTarget(get.prompt("runxin"), function (card, player, target) { return target.hp < target.maxHp; }) .set("autodelay", true).ai = function (target) { var num = get.attitude(player, target); if (num > 0) { if (noneed && player == target) { num = 0.5; } else if (target.hp == 1) { num += 3; } else if (target.hp == 2) { num += 1; } } return num; }; "step 1"; if (result.bool) { player.logSkill("runxin", result.targets); result.targets[0].recover(); } }, ai: { expose: 0.3, threaten: 1.5, }, }, xjzhimeng: { trigger: { player: "phaseEnd" }, direct: true, locked: true, unique: true, gainable: true, // alter:true, group: "xjzhimeng3", content: function () { "step 0"; player.chooseTarget(get.prompt("xjzhimeng"), function (card, player, target) { return player != target; }).ai = function (target) { var num = get.attitude(player, target); if (num > 0) { if (player == target) { num++; } if (target.hp == 1) { num += 3; } if (target.hp == 2) { num += 1; } } return num; }; "step 1"; if (result.bool) { var target = result.targets[0]; if (get.is.altered("xjzhimeng")) { target.draw(); } else { var card = get.cards()[0]; target.$draw(card); target.storage.xjzhimeng2 = card; game.addVideo("storage", target, ["xjzhimeng2", get.cardInfo(card), "card"]); target.addSkill("xjzhimeng2"); } player.logSkill("xjzhimeng", target); } }, ai: { expose: 0.2, }, }, xjzhimeng2: { intro: { content: "card", onunmark: function (storage, player) { delete player.storage.xjzhimeng2; }, }, mark: "card", trigger: { target: "useCardToBegin" }, frequent: true, filter: function (event, player) { return ( player.storage.xjzhimeng2 && get.type(event.card, "trick") == get.type(player.storage.xjzhimeng2, "trick") ); }, content: function () { player.draw(); }, ai: { effect: { target: function (card, player, target) { if ( target.storage.xjzhimeng2 && get.type(card, "trick") == get.type(target.storage.xjzhimeng2, "trick") ) { return [1, 0.5]; } }, }, }, }, xjzhimeng3: { trigger: { player: ["phaseBegin", "dieBegin"] }, silent: true, content: function () { "step 0"; event.players = game.filterPlayer(); event.num = 0; "step 1"; if (event.num < event.players.length) { var player = event.players[event.num]; if (player.storage.xjzhimeng2) { if (trigger.name == "die" && player == trigger.player) { player.storage.xjzhimeng2.discard(); } else { game.log(player, "发动织梦,获得了", player.storage.xjzhimeng2); player.gain(player.storage.xjzhimeng2, "gain2"); player.popup("xjzhimeng"); } player.removeSkill("xjzhimeng2"); } event.num++; event.redo(); } }, }, tannang: { enable: "chooseToUse", usable: 1, locked: false, filterCard: function (card) { return get.suit(card) == "club"; }, filter: function (event, player) { return player.countCards("h", { suit: "club" }); }, viewAs: { name: "shunshou" }, viewAsFilter: function (player) { if (!player.countCards("h", { suit: "club" })) return false; }, prompt: "将一张装备牌当顺手牵羊使用", check: function (card) { var player = _status.currentPhase; if (player.countCards("h", { subtype: get.subtype(card) }) > 1) { return 11 - get.equipValue(card); } if (player.countCards("h") < player.hp) { return 6 - get.value(card); } return 2 - get.equipValue(card); }, mod: { targetInRange: function (card, player, target, now) { if (card.name == "shunshou") return true; }, }, ai: { order: 9.5, threaten: 1.5, }, }, tuoqiao: { enable: "chooseToUse", filterCard: { color: "black" }, position: "he", viewAs: { name: "shihuifen" }, viewAsFilter: function (player) { return player.countCards("he", { color: "black" }) > 0; }, ai: { shihuifen: true, skillTagFilter: function (player) { return player.countCards("he", { color: "black" }) > 0; }, }, }, tuoqiao_old: { filter: function (event, player) { return ( game.players.length > 3 && (event.player == player.next || event.player == player.previous) ); }, check: function (event, player) { return get.effect(player, event.card, event.player, player) < 0; }, changeSeat: true, trigger: { target: "useCardToBefore" }, content: function () { if (trigger.player == player.next) { game.swapSeat(player, player.previous); } else if (trigger.player == player.previous) { game.swapSeat(player, player.next); } else { return; } trigger.cancel(); // player.popup('xiaoyao'); }, ai: { effect: { target: function (card, player, target, current) { if (target == player.next || target == player.previous) return 0.1; }, }, }, }, tianjian_old: { enable: "phaseUse", usable: 1, changeSeat: true, filterTarget: function (card, player, target) { return player != target && player.next != target; }, filterCard: true, check: function (card) { return 4 - get.value(card); }, content: function () { while (player.next != target) { game.swapSeat(player, player.next); } }, ai: { order: 5, result: { player: function (player, target) { var att = get.attitude(player, target); if (target == player.previous && att > 0) return 1; if (target == player.next.next && get.attitude(player, player.next) < 0) return 1; return 0; }, }, }, }, huimeng: { trigger: { player: "recoverAfter" }, frequent: true, content: function () { player.draw(2); }, ai: { threaten: 0.8, }, }, tianshe: { group: ["tianshe2"], trigger: { player: "damageBefore" }, filter: function (event) { if (event.hasNature()) return true; return false; }, forced: true, content: function () { trigger.cancel(); }, ai: { nofire: true, nothunder: true, effect: { target: function (card, player, target, current) { if (card.name == "tiesuo") return 0; if (get.tag(card, "fireDamage")) return 0; if (get.tag(card, "thunderDamage")) return 0; }, }, }, }, tianshe2: { trigger: { source: "damageAfter" }, filter: function (event, player) { if (event.hasNature() && player.hp < player.maxHp) return true; }, forced: true, content: function () { player.recover(); }, }, }, translate: { pal_xiahoujinxuan: "夏侯瑾轩", pal_muchanglan: "暮菖兰", pal_xia: "瑕", pal_jiangcheng: "姜承", pal_jiangyunfan: "姜云凡", pal_tangyurou: "唐雨柔", pal_longyou: "龙幽", pal_xiaoman: "小蛮", pal_wangxiaohu: "王小虎", pal_sumei: "苏媚", pal_shenqishuang: "沈欺霜", pal_longkui: "龙葵", pal_nangonghuang: "南宫煌", pal_wenhui: "温慧", pal_wangpengxu: "王蓬絮", pal_xingxuan: "星璇", pal_leiyuange: "雷元戈", pal_zhaoliner: "赵灵儿", pal_linyueru: "林月如", pal_lixiaoyao: "李逍遥", pal_xuejian: "雪见", pal_jingtian: "景天", pal_zixuan: "紫萱", pal_anu: "阿奴", pal_yuntianhe: "云天河", pal_hanlingsha: "韩菱纱", pal_liumengli: "柳梦璃", pal_murongziying: "慕容紫英", pal_changqing: "长卿", pal_xuanxiao: "玄霄", pal_yuejinzhao: "越今朝", pal_yueqi: "越祈", pal_luozhaoyan: "洛昭言", pal_xianqing: "闲卿", pal_mingxiu: "明绣", pal_jushifang: "居十方", xyufeng: "御蜂", xyufeng_info: "出牌阶段限一次,可以将一张黑桃牌当作机关蜂使用。", lingquan: "灵泉", lingquan_info: "觉醒技,结束阶段,若游戏轮数不小于3且你本回合使用的牌数大于你的体力值,你摸三张牌,然后获得技能【水蕴】。", shenwu: "神舞", shenwu_info: "觉醒技,在一名角色的结束阶段,若你本局至少发动过3次【水蕴】,你增加1点体力和体力上限并获得2点护甲,然后获得技能【回梦】。", txianqu: "仙音", txianqu_info: "出牌阶段限一次,当你即将造成伤害时,你可以防止之,然后摸两张牌并回复1点体力。", qiongguang: "穹光", qiongguang_info: "弃牌阶段结束时,若你弃置了至少两张牌,你可以对所有敌方角色施加一个随机的负面效果。", xunying: "迅影", xunying_info: "每当你使用杀对一名目标结算完毕后,你可以继续对目标使用杀。", liefeng: "冽风", liefeng_info: "锁定技,当你在回合内使用第二张牌时,你本回合获得【炎斩】;当你在回合内使用第三张牌时,你本回合获得【天剑】;当你在回合内使用第四张牌时,你本回合获得【御风】。", yuexing: "越行", yuexing2: "越行", yuexing_info: "出牌阶段限一次,你可以指定一名角色,本阶段内将你与该角色到其他角色的距离基数互换。", lingdi: "灵笛", lingdi_info: "出牌阶段,你可以弃置一张本回合与此法弃置的牌花色均不同的手牌,然后选择一名与你距离为X的角色与其各摸一张牌,X为本回合发动灵笛的次数(含此次)。", xiaoyue: "啸月", xiaoyue_info: "锁定技,每轮开始时,若你手牌中有杀,你将手牌中的一张随机杀对一名随机敌方角色使用,然后获得1点护甲。", minsha: "冥煞", minsha_info: "出牌阶段限一次,你可以弃置两张牌,对一名体力值大于1的其他角色造成1点雷属性伤害,然后距离目标1以内的所有其他角色随机弃置一张牌。", xhuanlei: "唤雷", xhuanlei_info: "每当你受到一次伤害,若伤害来源体力值大于你,你可以对其造成1点雷属性伤害,然后其摸一张牌。", anwugu: "巫蛊", anwugu2: "蛊", anwugu_info: "每当你对其他角色造成一次伤害,你可以令目标获得三枚蛊标记;拥有蛊标记的角色手牌上限-1,每回合最多使用X张牌(X为蛊标记数),每个结束阶段失去一枚蛊标记。", xtanxi: "探息", xtanxi_info: "出牌阶段限一次,你可以弃置一张手牌,然后随机选择一名手牌中有与之同名的牌的敌方角色,观看其手牌并获得任意一张。", linghuo: "灵火", linghuo_info: "每两轮限一次,在一名其他角色的结束阶段,若其本回合内造成过伤害,你可以对其造成1点火属性伤害。", guijin: "归烬", guijin2: "归烬", guijin2_bg: "烬", guijin_info: "每三轮限一次,出牌阶段,你可以观看牌堆顶的四张牌,然后可以将其中任意张牌分配给任意角色,被分到牌的角色跳过下一摸牌阶段,然后将剩余牌以原顺序放回牌堆顶。", chengxin: "澄心", chengxin2: "澄心", chengxin2_bg: "心", chengxin_info: "每四轮限一次,当一名角色进入濒死状态时,你可以令其将体力值回复至1,然后该角色防止一切伤害直到下一回合结束。", tianwu: "天舞", tianwu_info: "每当你使用卡牌指定一名敌方角色为唯一目标,你可以对其施加一个随机的负面效果。", tianwu_info_alter: "每当你使用卡牌指定一名敌方角色为唯一目标,你可以对其施加一个随机的负面效果,每回合限发动一次。", liguang: "离光", liguang_info: "结束阶段,你可以弃置一张手牌并将场上的一张牌移动到另一个合理的位置。", shiying: "逝影", shiying_info: "限定技,在一名其他角色死亡前,你可以防止其死亡,然后你与该角色失去全部技能、将体力和体力上限变为3、移去所有牌并摸三张牌。", yujia: "御甲", yujia_info: "每当你使用一张未强化的装备牌,你可以随机观看X张机关牌,并选择一张获得之,X为你本局使用过的机关牌数且至少为1。", xiepan: "械磐", xiepan_info: "每当你失去最后一张基本牌,你可以弃置一张手牌,然后获得一张随机装备牌。", yanshi: "偃师", yanshi_info: "觉醒技,结束阶段,若你累计有4个回合使用过机关牌,你增加1点体力和体力上限,然后用随机装备填满你的装备区。", ywuhun: "雾魂", ywuhun_bg: "魂", ywuhun_info: "锁定技,回合开始前,你获得一个额外的回合,并在此回合结束后复原场上及牌堆中的所有牌;当你在此回合中造成伤害后,终止所有结算并结束此回合。", // ywuhun_info_alter:'锁定技,回合开始前,你获得一个额外的回合,并在此回合结束后复原场上及牌堆中的所有牌;当你在此回合中造成伤害后,终止所有结算并结束此回合。', feichen: "飞尘", feichen_info: "", tanhua: "昙华", tanhua_info: "锁定技,你回复体力的效果改为摸两张牌;当你进入濒死状态时,你回复1点体力并失去此技能。", xjyingfeng: "影锋", xjyingfeng_info: "锁定技,每当你使用一张杀结算完毕后,你随机对一名不是此杀目标的敌方角色使用一张杀。", fenglue: "风掠", fenglue_info: "你可以放弃出牌阶段,改为指定一名其他角色并选择任意张手牌,依次对该角色使用,若如此做,此阶段内该角色每受到1点伤害,你在结算后摸一张牌。", xjzongyu: "纵雨", xjzongyu_info: "出牌阶段限一次,你可以弃置一张黑色手牌,视为使用一张飞镖,随机指定两名敌方角色为目标。", fanling: "返灵", fanling_info: "锁定技,每当一名角色失去体力,你回复1点体力,每回合只能发动一次。", huahu: "化狐", huahu_bg: "狐", huahu_info: "限定技,你可以失去所有技能和1点体力上限,然后令任意名其他角色回复1点体力、获得1点护甲并摸一张牌。", sheying: "蛇影", sheying_info: "每回合限一次,当你使用卡牌造成一次伤害后,你可以进行一次判定,若结果为黑色,你收回此牌。", dujiang: "毒降", dujiang_info: "出牌阶段限一次,你可以弃置一张黑色牌令一名随机敌人获得一张毒。", binxin: "冰心", binxin_info: "在一名角色的结束阶段,若其体力值为1,你可以令其获得1点护甲。", qixia: "绮霞", qixia_info: "锁定技,当你累计使用或打出了4种不同花色的牌后,你于本回合结束后获得一个额外回合。", jianzhen: "剑阵", jianzhen_info: "锁定技,当你使用杀对目标结算完毕后,其他角色可以对该目标使用一张杀,当有人选择出杀后终止此结算。", husha: "虎煞", husha_bg: "煞", husha_info: "每当你于出牌阶段造成1点伤害,你获得一枚虎煞标记(标记数不超过3);结束阶段,你可以选择一项:1. 移去一枚虎煞标记,视为对任意角色使用一张杀;2. 移去两枚虎煞标记,视为使用一张南蛮入侵;3. 移去三枚虎煞标记,视为对除你之外的角色使用一张元素毁灭。", longhuo: "龙火", longhuo_info: "结束阶段,你可以对所有角色各造成1点火焰伤害。", fenshi: "焚世", fenshi_info: "觉醒技,当你解除濒死状态时,你获得2点护甲,摸两张牌,然后获得技能龙火。", yanzhan: "炎斩", yanzhan_info: "出牌阶段限一次,你可以将一张红色牌当作火杀使用,此杀只能用与之花色相同的闪响应;若此杀造成了伤害,你本回合可以额外使用一张杀。", feixia: "飞霞", feixia_info: "出牌阶段限一次,你可以弃置一张红色牌视为对一名随机敌人使用一张不计入出杀次数的杀。", lueying: "掠影", lueying_info: "每当你使用一张杀,你可以随机获得目标的一张牌,然后目标可以指定一名其他角色,你弃置该角色一张牌(每回合限发动一次,没有弃牌目标时无法发动)。", feng: "风", feng_info: "锁定技,当你累计摸2次牌后,你下一次摸牌时摸牌数+1。", ya: "雅", ya_info: "锁定技,当你累计受到2次伤害后,你下一次受到的伤害-1。", song: "颂", song_info: "锁定技,当你累计造成2次伤害后,你下一次造成的伤害+1。", longxiang: "龙翔", longxiang_info: "当你使用杀指定目标后,你可以弃置目标若干张手牌直到其手牌数与你相同。", huxi: "虎袭", huxi_info: "你可以失去1点体力并获得1点护甲,视为使用一张杀。", xuanmo: "玄墨", xuanmo_info: "出牌阶段限一次,你可以将一张手牌置于牌堆顶并随机获得两张与之类别相同的牌。", danqing: "丹青", danqing_info: "结束阶段,若你累计使用了4张花色不同的牌,你可以选择至多4名角色随机获得一个正面效果。", danqing_info_alter: "结束阶段,若你累计使用了4张花色不同的牌,你可以选择至多2名角色随机获得一个正面效果。", zhangmu: "障目", zhangmu_info: "每回合限一次,当你需要使用或打出一张闪时,你可以展示一张闪,视为使用或打出了此闪。", feizhua: "飞爪", feizhua_info: "当你使用一张杀时,你可以将与目标相邻的角色追加为额外目标。", leiyu: "雷狱", leiyu_info: "结束阶段,你可以弃置一张黑色手牌,视为对本回合内所有成为过你的卡牌目标的角色使用一张惊雷闪。", lingxue: "灵血", lingxue_info: "锁定技,每当你回复1点体力,你获得1点护甲。", zhaoyao: "招摇", zhaoyao_info: "其他角色的摸牌阶段开始时,你可以与其拼点,若你赢,你摸两张牌,然后将两张牌置于牌堆顶。", sheling: "摄灵", sheling_info: "其他角色于你的回合内因使用、打出或弃置而失去牌时,你可以获得之(每回合最多发动三次)。", fenxing: "分形", fenxing_info: "锁定技,准备阶段,你有50%概率变身为另一形态。", guijiang: "鬼降", guijiang2: "鬼降", guijiang_info: "出牌阶段限一次,你可以弃置一张黑色牌,令一名其他角色无法成为回复牌的目标直到你下一回合开始。", diesha: "叠杀", diesha_info: "锁定技,每当你使用杀造成伤害,受伤害角色失去1点体力,你回复1点体力。", lingyu: "灵愈", lingyu_info: "结束阶段,你可以令一名其他角色回复1点体力。", diewu: "蝶舞", diewu_info: "出牌阶段,你可以将一张【杀】交给一名角色,若你于此阶段内首次如此做,你摸一张牌。", duxinshu: "读心", duxinshu_info: "出牌阶段限一次,你可以观看一名其他角色的手牌,然后可以用一张手牌替换其中的一张。", feixu: "飞絮", feixu_info: "每当一名角色使用或打出一张闪,你可以令其摸一张牌。", xuanyan: "玄炎", xuanyan2: "玄炎", xuanyan_info: "锁定技,你的火属性伤害+1;你造成火属性伤害后失去1点体力。", ningbin: "凝冰", ningbin_info: "锁定技,每当你受到1次雷属性伤害,你回复1点体力。", xfenxin: "焚心", xfenxin2: "焚心", xfenxin_info: "锁定技,每当你的体力值发生改变,你摸等量的牌;每当你杀死一名角色,你增加1点体力上限并回复1点体力。", xfenxin_info_alter: "锁定技,每当你的体力值发生改变,你摸一张牌。", luanjian: "乱剑", luanjian_info: "出牌阶段,你可以将两张杀当杀使用,此杀无视距离,可以指定任意名目标且有50%的机率伤害+1。", ctianfu: "天符", ctianfu2: "天符", ctianfu3: "天符", ctianfu_info: "出牌阶段,你可以将一张闪置于一名其他角色的武将牌上,该角色在下一次造成伤害时受到来自你的1点雷属性伤害并随机弃置一张牌,然后移去此牌。", shuiyun: "水蕴", shuiyun_bg: "蕴", shuiyun2: "水蕴", shuiyun5: "水蕴", shuiyun3: "水蕴", shuiyun_info: "结束阶段,你可以将一张与武将牌上的牌类别均不相同的手牌置于武将牌上称为“蕴”;任意一名角色处于濒死状态时,你可以弃置一张“蕴”令其回复1点体力。", shuiyun_info_alter: "结束阶段,你可以将一张与武将牌上的牌类别均不相同的手牌置于武将牌上称为“蕴”(不能超过2张);任意一名角色处于濒死状态时,你可以弃置一张“蕴”令其回复1点体力。", wangyou: "忘忧", wangyou_info: "其他角色的结束阶段,你可以弃置一张牌,令此回合内受过伤害的所有角色各摸一张牌。", changnian: "长念", changnian2: "追思", changnian2_info: "锁定技,结束阶段,你摸一张牌。", changnian_info: "你死亡时,可以将所有牌交给一名其他角色,令其获得技能〖追思〗。", sajin: "洒金", sajin_info: "出牌阶段限一次,你可以弃置一张手牌并指定任意名角色进行判定,若判定颜色与你弃置的牌相同,该角色回复1点体力。", jtjubao: "聚宝", jtjubao_info: "当其他角色于你的回合外首次弃置非基本牌时,你可以获得其中的随机一张。", guiyuan: "归元", guiyuan_info: "出牌阶段限一次,你可以弃置一张杀,然后回复1点体力并摸一张牌。", xshuangren: "双刃", xshuangren_info: "当你的武器牌被替换时,你可以将其置于你的武将牌上,并获得此装备的武器效果(不含距离)。", duci: "毒刺", duci_info: "每当你失去一次装备牌,可以对距离1以内的一名其他角色造成1点伤害。", shenmu: "神木", shenmu_info: "任意一名角色濒死时,你可以展示你的手牌并弃置其中的所有红色牌(至少一张),若如此做,该角色回复1点体力,然后摸X张牌,X为你弃置的手牌数。", qijian: "气剑", qijian_info: "弃牌阶段结束时,你可以指定至多X名目标视为使用一张杀,X为你于此阶段弃置的卡牌数。", poyun: "破云", poyun_info: "每当你造成一次伤害,你可以弃置一枚玄凝标记,然后弃置对方两张牌。", poyun_info_alter: "每当你造成一次伤害,你可以弃置一枚玄凝标记,然后弃置对方一张牌。", qianfang: "千方", qianfang_info: "准备阶段,若你有玄凝标记,你可以弃置3-X张牌和所有玄凝标记,视为使用了一张【万箭齐发】,每当一名敌方角色因此牌受到伤害,你摸一张牌。X为你的玄凝标记数。", qianfang_info_alter: "准备阶段,若你有玄凝标记,可以弃置3-X张牌和所有玄凝标记,视为使用了一张【万箭齐发】,X为你的玄凝标记数。", longxi: "龙息", longxi2: "龙息", longxi_info: "锁定技,在回合外每当你需要使用或打出一张卡牌时,若牌堆顶的前两张中有可使用或打出的牌,你立即获得之。", zhuyue: "逐月", zhuyue_info: "出牌阶段限一次,你可以弃置一张非基本牌并指定至多两个目标各随机弃置一张牌,若如此做,你本回合使用的杀须指定选中角色为目标。", zhuyue_info_alter: "出牌阶段限一次,你可以弃置一张黑色非基本牌并指定至多两个目标各随机弃置一张牌,若如此做,你本回合使用的杀须指定选中角色为目标。", guanri: "贯日", guanri_info: "限制技,你可以弃置两张红色手牌并失去1点体力,然后对一名体力值不少于你的其他角色造成2点火焰伤害并弃置其所有装备牌。", tianxian: "天弦", tianxian_info: "锁定技,你的杀无视距离且可指定任意多个目标,目标须进行一次判定,若结果为黑色则取消之。", xjzhimeng: "织梦", xjzhimeng2: "织梦", xjzhimeng3: "织梦", xjzhimeng_info: "结束阶段,你可以选择一名其他角色将牌堆顶的一张牌置于该角色的武将牌上,直到你的下个准备阶段将其收入手牌。当一名角色武将牌上有织梦牌时,每当其成为与此牌类型相同的卡牌的目标,可以摸一张牌。", xjzhimeng_info_alter: "结束阶段,你可以令一名其他角色摸一张牌。", runxin: "润心", runxin_info: "每当你使用或打出一张红桃牌,你可以令一名角色回复1点体力。", tannang: "探囊", tannang_info: "出牌阶段限一次,你可以将一张梅花手牌当顺手牵羊使用;你的顺手牵羊无距离限制。", tuoqiao: "烟瘴", tuoqiao_info: "你可以将一张黑色牌当作石灰粉使用。", xiaoyao: "逍遥", xiaoyao_info: "每当你成为其他角色的卡牌目标,你可以弃置一张与之花色相同的手牌取消之。", tianjian: "天剑", tianjian_info: "出牌阶段限一次,你可以将一张杀当作万箭齐发使用,受到伤害的角色随机弃置一张牌。", tianjian_info_alter: "出牌阶段限一次,你可以将一张杀当作万箭齐发使用。", xjyufeng: "御风", xjyufeng_info: "锁定技,当你失去手牌后,若手牌数少于2,你将手牌数补至2(每回合最多发动两次)。", huimeng: "回梦", huimeng_info: "每当你回复1点体力,可以摸两张牌。", tianshe: "天蛇", tianshe2: "天蛇", tianshe_info: "锁定技,你防止即将受到的属性伤害,每当你造成一次属性伤害,你回复1点体力。", }, }; });